不知道从几何开始, 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
在外部可以通过点语法或者 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 都覆写了.
此时你会看到编译报错了, 报错信息就是找不到 _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