// // Iphone.h // day13 #import <Foundation/Foundation.h> typedef enum { kFlahlightStatusOpen, kFlahlightStatusClose } FlahlightStatus; @interface Iphone : NSObject { int _cpu; } + (void)carameWithFlahlightStatus:(FlahlightStatus)status; + (void)openFlahlight; + (void)closeFlahlight; @end
// // Iphone.m // day13 #import "Iphone.h" @implementation Iphone /* 类方法中可以直接调用类方法 类方法中不可以直接调用对象方法 类方法中不能访问成员变量 */ + (void)carameWithFlahlightStatus:(FlahlightStatus)status { if (status == kFlahlightStatusOpen) { // [Iphone openFlahlight]; // 其实在类方法中调用类方法除了可以使用类名调用以外, 还可以使用self来调用 [self openFlahlight]; }else { // [Iphone closeFlahlight]; // self == Iphone [self closeFlahlight]; } NSLog(@"拍照"); } + (void)openFlahlight { NSLog(@"打开闪光灯"); } + (void)closeFlahlight { NSLog(@"关闭闪光灯"); } @end
// // main.m // self关键字 #import <Foundation/Foundation.h> #import "Iphone.h" int main(int argc, const char * argv[]) { // self不能离开类, 离开类之后没有任何意义 [Iphone carameWithFlahlightStatus:kFlahlightStatusClose]; return 0; }
self2:
// // Iphone.h // day13 #import <Foundation/Foundation.h> typedef enum { kFlahlightStatusOpen, kFlahlightStatusClose } FlahlightStatus; @interface Iphone : NSObject { int _cpu; } - (void)carameWithFlahlightStatus:(FlahlightStatus)status; - (void)openFlahlight; - (void)closeFlahlight; @end
// // Iphone.m // day13 #import "Iphone.h" @implementation Iphone /* 如果self在对象方法中, 那么self就代表调用当前对象方法的那个对象 如果self在类方法中, 那么self就代表调用当前类方法的那个类 总结: 我们只用关注self在哪一个方法中 , 如果在类方法那么就代表当前类, 如果在对象方法那么就代表"当前调用该方法的对象" */ - (void)carameWithFlahlightStatus:(FlahlightStatus)status { if (status == kFlahlightStatusOpen) { // 其实self不仅仅可以调用我们的类方法, 还可以调用对象方法 // self == 对象 == p NSLog(@"self = %p", self); [self openFlahlight]; }else { [self closeFlahlight]; } NSLog(@"拍照"); } - (void)openFlahlight { NSLog(@"打开闪光灯"); } - (void)closeFlahlight { NSLog(@"关闭闪光灯"); } @end
// // main.m // self关键字2 #import <Foundation/Foundation.h> #import "Iphone.h" int main(int argc, const char * argv[]) { Iphone *p = [Iphone new]; NSLog(@"p = %p", p); [p carameWithFlahlightStatus:kFlahlightStatusOpen]; return 0; }
self3:
// // Iphone.h // day13 #import <Foundation/Foundation.h> typedef enum { kFlahlightStatusOpen, kFlahlightStatusClose } FlahlightStatus; @interface Iphone : NSObject { int cpu; } - (void)setCpu:(int)cpu; + (void)carameWithFlahlightStatus:(FlahlightStatus)status; + (void)openFlahlight; + (void)closeFlahlight; @end
// // Iphone.m // day13 #import "Iphone.h" @implementation Iphone /* 如果self在对象方法中, 那么self就代表调用当前对象方法的那个对象 如果self在类方法中, 那么self就代表调用当前类方法的那个类 总结: 我们只用关注self在哪一个方法中 , 如果在类方法那么就代表当前类, 如果在对象方法那么就代表"当前调用该方法的对象" 注意: >self会自动区分类方法和对象方法, 如果在类方法中使用self调用对象方法, 那么会直接报错 >不能在对象方法或者类方法中利用self调用当前self所在的方法 使用场景: 可以用于在对象方法之间进行相互调用 可以用于在类方法之间进行相互调用 可以用于区分成员变量和局部变量同名的情况 */ + (void)carameWithFlahlightStatus:(FlahlightStatus)status { if (status == kFlahlightStatusOpen) { NSLog(@"self = %p", self); [self openFlahlight]; // p }else { [self closeFlahlight]; } NSLog(@"拍照"); } + (void)openFlahlight { NSLog(@"打开闪光灯"); NSLog(@"self = %p", self); // 死循环 [self openFlahlight]; // p } + (void)closeFlahlight { NSLog(@"关闭闪光灯"); } - (void)setCpu:(int)cpu { self->cpu = cpu; } @end
// // main.m // self关键字的注意点 #import <Foundation/Foundation.h> #import "Iphone.h" int main(int argc, const char * argv[]) { [Iphone carameWithFlahlightStatus:kFlahlightStatusOpen]; // Iphone *p = [Iphone new]; // NSLog(@"p = %p", p); // [p carameWithFlahlightStatus:kFlahlightStatusOpen]; return 0; }