Objective - C基础: 第二天 - 7.self使用注意事项
前面我们学了self的基本使用, 现在我们来看看self的注意事项~~
1.死循环
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)test; + (void)test; @end @implementation Preson - (void)test { NSLog(@"调用了实例方法."); [self test]; //死循环 } + (void)test { NSLog(@"调用了类方法."); [self test]; //死循环 } @end int main() { Preson *p = [Preson new]; [p test]; [Preson test]; return 0; }
如果像上面这样子的调用方法, 那必然会造成死循环, 其实这里面的和我们之前讲类方法的时候一样, 自己调用自己, 就会造成无线循环.
2. 小心调用时候的陷阱.
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)test; + (void)test; - (void)test1; + (void)test2; @end @implementation Preson - (void)test { NSLog(@"调用了实例方法."); } + (void)test { NSLog(@"调用了类方法."); } - (void)test1 { [self test]; } + (void)test2 { [self test]; } @end int main() { Preson *p = [Preson new]; [p test]; [Preson test]; return 0; }
输出的结果是:
2015-01-18 10:36:28.374 a.out[16527:1789113] 调用了实例方法.
3. 调用方法时要注意类型
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)test1; + (void)test2; @end @implementation Preson - (void)test1 { NSLog(@"哈哈哈哈哈"); } + (void)test2 { [self test1]; } @end int main() { [Preson test2]; return 0; }
编译链接:
Cain:2.第二天 Cain$ cc 09-self的注意事项.m -framework Foundation 09-self的注意事项.m:16:11: warning: class method '+test1' not found (return type defaults to 'id'); did you mean '+test2'? [-Wobjc-method-access] [self test1]; ^~~~~ test2 1 warning generated.
编译链接时并不会报错, 只会有一个小警告, 运行时:
2015-01-18 10:45:39.698 a.out[16551:1792006] +[Preson test1]: unrecognized selector sent to class 0x10d806160
这个报错和我们之前的报错是一样的, 没有找到对应的test1的类方法, 所以在使用self的时候, 要注意调用的方法是否符合类型.
下面这个也是如此:
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)test1; + (void)test2; @end @implementation Preson - (void)test1 { NSLog(@"哈哈哈哈哈"); } void test3() { } + (void)test2 { [self test3]; } @end int main() { [Preson test2]; return 0; }
这样子也是不行的, 调用函数的时候, 不能使用self调用.
补充一下:
self的用途:
1> 谁调用了当前方法,self就代表谁
* self出现在对象方法中,self就代表对象
* self出现在类方法中,self就代表类
2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法\类方法
好了, 这次我们就到这里, 下次我们继续~~~