#关于@property的一些小总结
1、大家都知道,@property在之前版本中,只是成员变量set方法和get方法的声明,之前老版本需要在.m文件中加上@synthesize才会有成员变量的方法实现,也就是,设置器(set方法)和访问器(get方法),但现在这个版本只要用@property修饰就可以同时生成方法声明和实现的语句,同时生成一个加下划线的属性名。
在这里要注意一个问题:
当你用@property声明一个属性时,在.m文件中就会有此属性的两个方法实现,此时编辑器默认的生成属性名为带下划线的。现在如果想要自定义set方法和get方法,当你单独实现set方法时,没有问题,但是你还想自定义一个get方法时,就会报错,下面例子:
//Student的声明文件
# import < Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,strong) NSString * name;//声明和实现了name的set方法和get方法,生成一个带下划线的属性名
@end
//Student的实现文件.m
# import"Student.h"
@implementation Student
- (void)setName:(NSString *)name//此时单独自定义一个set方法时,程序不会出现任何问题
{
_name = name;
}
//注意一下当下面自定义一个get方法时会出现错误
- (NSString *)name
{
return _name;
}
@end
其实问题出现就是同时自定义实现了set方法和get方法,这时Xcode不会自动生成@synthesize,也就不会自动生成带下划线_name,所以我们要解决这个问题有3种做法,一个是直接删掉自定义get方法,因为get方法我们一般用默认的就行了,另一个做法就是在前面合成一下即加上 @synthesize name = _name; 或者在.h文件中@interface下定义一个下划线的属性,问题即可解决。
2、关于@property后面内括号关键字的一点小结
原子,非原子 (atomic,nonatomic)百度一下你就知道
说一下retain和copy是做了些什么
(1)retain:内存管理中,setter方法release旧值(计数器-1),再retain新值(计数器+1)
(2)copy:内存管理中,setter方法release旧值(计数器-1),再copy新值(计数器+1)
代码如下:
- (void)setName:(NSString *)name
{
if(_book != book)
{
//先释放旧的成员变量
[_book release];
//再retain新传进来的对象
_book = [book retain];
}
}