Self的使用:
1 self不能离开类 离开类之后没有任何意义
2 self会自动区分类方法和对象方法
3 使用self的时候只需要关注self在哪一个方法中
如果在类方法中使用self 那么self就代表当前类
如果在对象方法中使用self 那么self就代表"当前调用该方法的对象"
声明文件.h:
#import <Foundation/Foundation.h> @interface Phone : NSObject { // 手机牌子 NSString* _type; } /*--------------------------getter-setter方法------------------------*/ // 属性读写器 - (void) setType: (NSString *) type; - (NSString *) type; /*--------------------------对象方法----------------------------------*/ // 打电话 - (void) callWithNumber: (NSString *) number; // 发短信给 - (void) sendMessageWithNumber: (NSString *) number andContent: (NSString *) content; /*---------------------------类方法----------------------------------*/ // 警告 + (void) alert; // 关机 + (void) turnOFF; @end
实现文件.m:
#import "Phone.h" @implementation Phone /*----------------实现属性读写器-------------------*/ - (void)setType:(NSString *)type{ _type = type; } - (NSString *)type{ return _type; } /*----------------实现对象方法--------------------*/ // self == 当前调用该方法的对象 == phone // 打电话 - (void)callWithNumber:(NSString *)number{ // 使用self在对象方法中访问成员变量 NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number); } //发短信 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content); // 使用self在对象方法中调用其他对象方法 [self callWithNumber:number]; } /*----------------实现类方法----------------------*/ // self == 当前类 == Phone // 警告 + (void)alert{ NSLog(@"警告 手机电量不足 请及时充电"); // 使用self在类方法中调用其他类方法 [self turnOFF]; } // 关机 + (void)turnOFF{ NSLog(@"手机即将关机"); } @end
Main.m:
#import <Foundation/Foundation.h> #import "Phone.h"
int main(int argc, const char * argv[]) { Phone * phone = [Phone new]; phone.type = @"iPhone"; [phone sendMessageWithNumber:@"13222334455" andContent:@"对象方法发短信"]; [Phone alert]; return 0; } /* 2015-08-30 14:01:23.277 self[509:24866] 用 iPhone 手机给 13222334455 发短信 短信内容: 对象方法发短信 2015-08-30 14:01:23.278 self[509:24866] 用 iPhone 手机给 13222334455 打电话 2015-08-30 14:01:23.278 self[509:24866] 警告 手机电量不足 请及时充电 2015-08-30 14:01:23.278 self[509:24866] 手机即将关机 */
Self使用注意:
1 在setter-getter方法中 不能使用self和点语法来对成员属性进行赋值和取值操作 会造成死循环
/*----------------实现属性读写器-------------------*/ - (void)setType:(NSString *)type{ // _type = type; //self->_type = type; self.type = type; // 等效于 [self setType: type] 循环调用 setType: 方法 } - (NSString *)type{ // return _type; // return self->_type; return self.type; // 等效于 [self type]; 循环调用 type 方法 }
2 在对象方法中调用类方法 会报错 因为self在对象方法中代表的是对象 而类方法需要通过类来调用
//发短信 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content); // 使用self在对象方法中调用其他对象方法 [self callWithNumber:number]; // 错误信息: No visible @interface for 'Phone' declares the selector 'alert'
[self alert]; } /*----------------实现类方法----------------------*/ // self == 当前类 == Phone // 警告 + (void)alert{ NSLog(@"警告 手机电量不足 请及时充电"); // 使用self在类方法中调用其他类方法 [self turnOFF]; }
3 在类方法中不能调用对象方法或访问成员变量 因为对象方法和成员属性属于对象
/*----------------实现对象方法--------------------*/ // self == 当前调用该方法的对象 == phone // 打电话 - (void)callWithNumber:(NSString *)number{ // 使用self在对象方法中访问成员变量 NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number); } /*----------------实现类方法----------------------*/ // self == 当前类 == Phone // 警告 + (void)alert{ NSLog(@"警告 手机电量不足 请及时充电"); // 使用self在类方法中调用其他类方法 [self turnOFF]; // 错误信息: No known class method for selector 'callWithNumber:' [self callWithNumber:@"13344552211"]; }
4 不能在对象方法或者类方法中利用self调用当前self所在的方法 会造成死循环
// 打电话 - (void)callWithNumber:(NSString *)number{ // 使用self在对象方法中访问成员变量 NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number); [self callWithNumber:number]; // 死循环 } // 关机 + (void)turnOFF{ NSLog(@"手机即将关机"); [self turnOFF]; // 死循环 }
self使用场景:
> 可以用于在对象方法之间进行相互调用
> 可以用于在类方法之间进行相互调用
> 可以用于区分成员变量和局部变量同名的情况
#import "Phone.h" @implementation Phone /*----------------实现属性读写器-------------------*/ - (void)setType:(NSString *)type{ // _type = type; //self->_type = type; self.type = type; // 等效于 [self setType: type] 死循环
} - (NSString *)type{ // return _type; //return self->_type; return self.type; // 等效于 [self type]; 死循环 } /*----------------实现对象方法--------------------*/ // self == 当前调用该方法的对象 == phone // 打电话 - (void)callWithNumber:(NSString *)number{ // 使用self在对象方法中访问成员变量 NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number); [self callWithNumber:number]; // 调用当前所在方法 死循环 } //发短信 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content); // 使用self在对象方法中调用其他对象方法 [self callWithNumber:number]; // 对象方法中调用类方法 错误信息: No visible @interface for 'Phone' declares the selector 'alert' [self alert]; } /*----------------实现类方法----------------------*/ // self == 当前类 == Phone // 警告 + (void)alert{ NSLog(@"警告 手机电量不足 请及时充电"); // 使用self在类方法中调用其他类方法 [self turnOFF]; // 类方法中调用对象方法 错误信息: No known class method for selector 'callWithNumber:' [self callWithNumber:@"13344552211"]; // 类方法中访问成员变量 错误信息: No member named 'type' in 'struct objc_class' NSLog(@"type = %@", self.type); } // 关机 + (void)turnOFF{ NSLog(@"手机即将关机"); [self turnOFF]; // 调用当前所在方法 死循环
} @end