Objective - C基础: 第二天 - 7.self使用注意事项

来源:互联网 发布:apache ant 1.9.6安装 编辑:程序博客网 时间:2024/06/03 15:04

前面我们学了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];  //死循环}@endint 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];}@endint main(){    Preson *p = [Preson new];    [p test];            [Preson test];    return 0;}

输出的结果是:

2015-01-18 10:36:28.374 a.out[16527:1789113] 调用了实例方法.


使用self的时候, 它对根据你的调用者是类, 就去调用相应的类方法, 是对象, 就会调用相应的实例方法, 并不会随便乱调用.



3. 调用方法时要注意类型

#import <Foundation/Foundation.h>@interface Preson : NSObject- (void)test1;+ (void)test2;@end@implementation Preson- (void)test1{    NSLog(@"哈哈哈哈哈");}+ (void)test2{    [self test1];}@endint main(){    [Preson test2];        return 0;}

编译链接:

Cain:2.第二天 Cain$ cc 09-self的注意事项.m -framework Foundation09-self的注意事项.m:16:11: warning: class method '+test1' not found      (return type defaults to 'id'); did you mean '+test2'? [-Wobjc-method-access]    [self test1];          ^~~~~          test21 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];}@endint main(){    [Preson test2];        return 0;}

这样子也是不行的, 调用函数的时候, 不能使用self调用.




补充一下:

 self的用途:

 1> 谁调用了当前方法,self就代表谁

 * self出现在对象方法中,self就代表对象

 * self出现在类方法中,self就代表类

 

 2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量

 

 3> [self 方法名]可以调用其他对象方法\类方法





好了, 这次我们就到这里, 下次我们继续~~~

0 0
原创粉丝点击