OC坑集: 实例变量不需要 @synthesize

不知道从几何开始, OC 中可以只写 @property 不写 @synthesize 了.

虽然有点不习惯,但是用过之后觉得比较方便.

你需要知道, 写了@property 之后

1. 自动生成了_xxx这样的实例变量.

2. 如果你手动重写 setXXX 和 XXX 方法, 就不会为你自动生成 _xxx 实例变量了.

@interface Cat : NSObject

@property (copy, nonatomic) NSString *name;

- (void)echo;

@end

Cat 具有实例变量 name 和一个实例方法 echo.

实现文件中,可以这样写

#import "Cat.h"

@implementation Cat

- (void)echo
{
    _name = @"XiaoHua";
    NSLog(@"name = %@", _name);
}

@end


其中 _name 就是自动生成的实例变量名称.可以直接访问.

在外部可以通过点语法或者 setName 和 name 访问实例变量 _name.比如在 main.m 文件中

#import "Cat.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Cat *ct = [[Cat alloc] init];
        
        [ct setName:@"HuaHua"];
        NSLog(@"cat's name is %@", [ct name]);
        
        ct.name = @"XiaoHuaHua";
        NSLog(@"cat's name is %@", ct.name);
    }
    
    return 0;
}


上面说过, 只要你手动实现了 setter 和 getter, 就不会自动产生 _xxx 实例变量了.

切记必须是 setter 和 getter 都覆写了.



此时你会看到编译报错了,  报错信息就是找不到 _name 这个变量了.

解决这个问题的方法有很多, 这里推荐一个超级简单的方式.

修改 Cat.m 文件, Cat.h 文件不需要改动.

#import "Cat.h"

@implementation Cat

@synthesize name = _name;

- (void)echo
{
    _name = @"XiaoHua";
    NSLog(@"name = %@", _name);
}

- (void)setName:(NSString *)name
{
    //TODO
}

- (NSString *)name
{
    return _name;
}

@end


©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页