从事iOS开发有些年头了发现有些基础的东西还是会因为时间久远而不记得一些细节,现在开始慢慢整理一些东西来帮助思考.
简单摘要
assign
:简单赋值,不会更改索引计数
retain
: 释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
copy
: 会建立一个索引计数为1的对象,然后释放旧对象
readonly
:表示这个属性是只读的,就是只生成getter方法,不会生成setter方法
readwrite
:属性为可读写
nonatomic
:非原子性访问,不加同步
@synthesize
、:编译器自动实现getter/setter方法
@dynamic
:手动实现getter/setter方法
@property
:
copy, retain, assign区别
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
assign: 简单赋值,不更改索引计数(Reference Counting)
copy: 建立一个索引计数为1的对象,然后释放旧对象
* 使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)
* 使用copy: 对NSString
* 使用retain: 对其他NSObject和其子类
copy的使用举例
@property(nonatomic,copy)NSString * str;
在setter方法中
- (void)setStr:(NSString *)str{
if(_str != str){ //判断是否需要重新赋值
[_str release]; //释放旧引用,计数器-1
_str = [str copy]; //重新赋值,使用copy }
}
- (void)test{
NSMutableSting *s = [[NSMutableSting alloc] setString:@"hello"];
p.str = s; //此时,str的值为@"hello"
[s appendString:@"world"]; //此时,s的值为"hello world",但是str的值依然为"hello".
}
@dynamic @synthesize 区别
@synthesize 如果没有手动实现setter方法和getter方法,那么编译器会自动加上这两个方法
@dynamic 告诉编译器属性的setter与getter方法由用户自己实现,不自动生成。(对于readonly的属性只需提供 getter方法即可)
网友评论