assign,retain,copy的setter和getter
2019-04-03 本文已影响0人
巴赫海兹
OC中,synthesize的含义就是使编译器自动生成对应的setter和getter方法,dynamic就是需要手动生成对应的setter和getter方法,下面的代码展示了当属性的语义特性声明为assign,retain和copy时,对应的setter和getter方法内部实现。
- 语义特性声明为assign
- (void)setAge:(int)age{
_age = age;
}
- (int)age{
return _age;
}
注意!
- 属性的setter方法和getter方法是不能同时进行重写的,这是因为,一旦你同时重写了这两个方法,那么系统就不会帮你生成这个成员变量了,所以会报错,如果真的就想非要重写这个属性的setter和getter方法的话,就要手动生成成员变量,然后就可以重写了。或者是用@synthesize,想要详细了解@synthesize的可以戳这里
https://www.jianshu.com/p/6d80cacab384
我们可以这样写
@synthesize age = myAge;
- (void)setAge:(NSString *)age {
myAge = age;
}
- (NSString *)age {
return myAge;
}
- 当语义特性声明为retain时
- (void)setName:(Test *)name{
if (_name != name) {
[_name release];
[_name retain];
_name = name;
}
}
- (Test *)name{
return _name;
}
- 当语义特性声明为copy时
- (void)setSex:(Test *)sex{
if (_sex != sex) {
[_sex release];
[_sex copy];
_sex = sex;
}
}
- (NSString *)sex{
return _sex;
}
注意!
iOS中的 NSString NSArray 这种iOS自身的对象貌似都做了一些优化,打印其retainCount的数值都是-1这种情况。
但是我们自己创建一个类
Test.h
用它来创建的对象是完全和我们之前理解的retainCount预期值是相同的。