Objective

前面我们学了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] 调用了实例方法.


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



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 方法名]可以调用其他对象方法类方法





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

原文地址:https://www.cnblogs.com/iOSCain/p/4282850.html