Object-C属性
@property (retain,nonatomic)UILabel titleLabel;
在objective-C中添加属性之前,通常会定义一些方法用于设置和检索类的实例变量的值。这些方法称为访问方法和修改方法(或称为获取方法和设置方法)。
属性的点表示法:
text = [_titleLabeltext];
text = _titleLabel.text;
就编译器而言,这两条语句是完全相同的,点表示法同样适用于修改方法,如下:
[_titleLabelsetText:@"123"];
_titleLabel.text =@"123";
在声明中,@property关键字后面紧跟着一些可选属性(位于圆括号内),它们进一步定义编译器将如何创建访问方法和修改方法。
(1)retain: 通知编译器向分配给此属性的对象发生一个保留(retain)消息。这将确保属性底层的实例变量在使用过程中不会从内存清除。这是必不可少的,默认行为(assign)需要与垃圾收集一起使用。如果定义的一个属性是对象(与int等原始数据类型相反),则通常在可选属性中指定retain。
为int、float或其他原始数据类型声明属性时,不需要指定任何可选属性。
(2)nonatomic: 将更改访问方法和修改方法的生成方式。在默认情况下,这些方法在创建时会具备另外一些代码,用于帮助你编写多线程程序。这些额外的开销虽然较小,但是对于声明指向用户界面对象的指针没有必要,因此我们通过声明nonatomic来节省一些开销。一般规则,大多数情况下,都将指定nonatomic属性。
(3)assign: 用于int、float等原始数据类型,(此属性为默认值)
iOS5新功能ARC(Automatic Reference Counting),新的关键字: strong,weak,unsafe_unretained
(4)strong:于retain类似,引用计数自动+1, (owning)
(5)weak: 用weak修饰,一旦内存被释放,指针将都指向nil,可以防止野指针。(non-owning) 如: Delegate, IBOutlet一般用weak
(6)copy: 建立一个索引计数为1的对象,释放旧的对象。此属性仅用于对象类型,它必须实现NSCopying协议, 如: NSString,Block
(7)unsafe_unretained: 与weak有点类似,但是它是unsafe的,一旦内存释放,容易造成野指针闪退, 尽量少用unsafe_unretained
copy与retain的区别:
1)retain是指针拷贝,copy是内容拷贝; retain的set方法是浅复制,copy的set方法是深复制。
2)建立一个索引计数为1的对象,然后释放旧对象,对NSString。它指出,在赋值时使用传入值的一份拷贝。copy工作由copy方法执行,此属性只对那些实现了NSCopying协议的对象类型有效 。
3)释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。对其他NSObject和其子类。指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。
以上为常用来声明属性,__strong, __weak, __unsafe_unretained, __autoreleasing,常用来声明临时变量
(8)__block: ARC与MRC模式下都可用,可以修饰对象,也可修饰基本数据类型。
(9)__weak: 只能在ARC模式下使用,只能修饰对象,不能修饰基本数据类型(int等)。
(10)__block: 对象可以在block中改变值。
参考:[iPhone 开发基础教程]
http://www.cnblogs.com/langtianya/p/3691035.html
http://blog.sina.com.cn/s/blog_4ac45c260102w3a5.html
http://www.jianshu.com/p/c1d609d1569b