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

来源:互联网 发布:java collection接口 编辑:程序博客网 时间:2024/06/16 16:06

不知道从几何开始, 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


0 0
原创粉丝点击