原文:http://blog.sina.com.cn/s/blog_b6e3f371010199sa.html
NO.1: 关键字“NS”
NO.2:关键字“@property
property自动生成了-setsmsHandling 和-getsmsHandling两个方法来操作属性.
NO.3:关键字“self and super”
self:执行方法的对象本身。
那么“_myObject”才是代表属性本身,而“myObject”只是代表该属性的存取方法名。“myObbject”并不能直接访问属性的存取方法,
super:调用对象的父类中的实现来执行方法
super和self相同的地方是,它们指向的是相同的消息接收者。不同的是,当使用
NO.4:关键字“alloc
1、自定义初始化方法的命名一般应以“init”开头。
2、初始化方法的返回值类型必须是id。
3、在自定义初始化方法的实现中,必须有对本类的指定初始化方法的引用
4、在实现中引用其它初始化方法时,注意把返回值赋给self。
5、在对实例变量赋值时,进行直接访问,而不是透过访问器
6、在实现的最后返回self,如果初始化过程失败,则返回nil。
NO.5:关键字:“@property(*)括号中的属性内容”
readonly
此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
readwrite
此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。
assign
使用assign:仅仅针对对基础数据类型(NSInteger,CGFloat)和C数据类型(int,float, double, char, 等等),即不能用于对象。简单的赋值,不更改引用计数。为了解决基本数据类型与循环引用问题而设计。
此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。
retain
NSObject和其子类。始终为浅复制,保留计数加1。必须保持该对象时用到。
指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于CoreFoundation对象。(原因是,retain会增加对象的引用计数,而基本数据类型或者CoreFoundation对象不存在引用计数的说法)。
copy
使用copy: NSObject和其子类。对于可变对象,为深复制,引用计数不加1(对参数进行release旧值再retain新值);对于不可变对象,为浅复制,保留计数加1。(注:所以对于不可变对象的浅复制一般用retain,这也是为什么网上很多朋友简单的误认为copy是深复制的原因之一)。
它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。为了减少对上下文的依赖而引入的机制(主要针对可变对象)。注意copy始终返回一个不可变对象。
nonatomic
指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。
其实这是为了禁止使用mutex(互斥)锁保护属性存取器方法。编写线程安全代码的人会使用mutex锁定来防止同一代码中的两个线程同时执行,如果同时执行会导致可怕的问题。然而这种锁定也会让程序变慢。如果未指定nonatomic或者指定了atomic(默认),那么会使mutex锁定保护实例变量,即能提高多线程性能。