#import
导入接口,确保同一个文件永远不会被包含多次;比#include的好处就是不会引起重复包含(交叉编译)
#include
导入接口
@class
一般用于头文件中需要声明该类的某个实例变量的时候用到。
@interface
类接口的声明以编译器指令开头 @interface 并以 指令结束 @end。
@property
声明属性
+ -
+ 类对象,类方法可以使用的方法的名称,前面加 一个加号 +
- 类实例可以使用的方法,实例方法,标有减号 -
@implementation
类接口的实现
@synthesize
如果不在@implementation块中提供属性,则使用 该指令告诉编译器它应该为属性合成setter和/或 getter方法。@sythesize如果没有声明,该指令 还会合成一个适当的实例变量。 无论是否指定实例变量的名称,该@sythesize指 令只能使用当前类的实例变量,而不能使用超 类。
@dynamic
使用@dynamic关键字告诉编译器您将通过直接提 供方法实现或在运行时使用其他机制(如动态加 载代码或动态方法解析)来实现属性隐含的API契 约。它会抑制编译器在无法找到合适的实现时会 产生的警告。只有在知道方法在运行时可用时才 应使用它。
要点:如果未指定@sythesize或@dynamic为特定属性 指定,则必须为该属性提供getter和setter(或者 只是readonly属性的getter )方法实现。如果不这 样做,编译器会生成警告。
@private
实例变量 只能在声明它的类中访问。
@protected
实例变量可以在声明它的类中以及继承它的类中 访问。没有显式范围指令的所有实例变量都有 @protected范围。
@public
实例变量随处可访问。
@package
实例变量可以在包内部访问,一个项目一定是在同一个包下。
@protocol
协议名
@required
必须实现的协议方法(默认)
@optional
将协议方法标记为可选
属性
访问者方法名称
getter=getterName
指定属性的get访问器的名称。getter必须返回与 属性类型匹配的类型,并且不带参数。
setter=setterName
指定属性的set访问器的名称。setter方法必须采用 与属性类型匹配的类型的单个参数,并且必须返 回vid。如果指定属性ready并且还指定了setter setter=,则会收到编译器警告。 通常,您应指定符合键值编码的访问者方法名称 (请参阅键值编码编程指南) - 使用getter装饰器 的常见原因是遵守布尔值的isPrertyNae约定。
可写
readwrite
指示应将该属性视为读/写。此属性是默认值。 @implementation块中需要getter和setter方法。 如果@sythesize在实现块中使用该指令,则会合 成getter和setter方法。
此属性是默认值, 会自动为你生成存取器。
readonly
表示该属性是只读的。 如果指定readonly,则@implementation块中只需 要getter方法。如果@sythesize在实现块中使用 该指令,则仅合成getter方法。此外,如果您尝试 使用点语法分配值,则会出现编译器错误。
只生成getter不会有setter方法。
set的语义学
strong
强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
strong与retain功能相似;
weak
弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。
weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
(OS X v10.6和iOS 4不支持弱属性;请assig改 用。)
assign
默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。例如NSIteger和 CGRect。
retain
释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。
指定retain在赋值时应在对象上调用。 先前的值会发送一条reease消息。
在OS X v10.6及更高版本中,您可以使用该 __attribute__关键字指定应将Core Foundation属性 视为用于内存管理的Objective-C对象:
@property(retain)__ attribute __ ((NSObject))CFDictionaryRef myDictionary;
copy
与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法
原子性
nonatomic
指定访问者是非原子的。默认情况下,访问器是原子的。
-----------------------------------------
如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。
当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问;它是非线程安全型,访问速度快;当两个不同的线程对其访问时,容易失控。
atomic
默认情况下,属性是合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程 同时执行什么,始终完全检索或设置从getter返回 的值或通过setter设置的值。如果指定strong, copy或者retain未指定nonatomic,则在引用计数环境中, 对象属性的合成get访问器使用锁并保留并自动释放返回的值
- 实现将类似于以下内容:
[_内锁]; //使用对象级锁定锁定
id resut = [[retai retain] autreease];
[_内部解锁];
返回结果; 如果指定atomic,则对象属性的合成访问器只是直接返回值。
-----------------------------------------
这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问;该变量为线程安全型,但是会影响访问速度;在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set加了atomic,setter函数会变成下面这样:
if (property != newValue) {
[property release];
property = [newValue retain];
}
@encode
@encode为编译器宏,它可以将类型转换为响应 的字符串。
id
可以调用任何对象方法,不能进行编译检测(运 行时容易找不到方法)。 id是指向 Objective-C类对象的指针,它可以声明为任何类 对象的指针,当在Objective-C中应用id时,编译 器会假定你知道,id指向哪个类的对象。与void是不同的是,void编译器不知道也不假定指向任何类型的指针。
nil
定义为一个常量,若是一个指针的值为nil,代表这个指针没有指向任何对象。
self
在Objective-C中,关键字sef与c++中this是同一 概念,就是类对象自身的地址,经由过程self可以 调用本身的实例变量和办法
Super
当子类须要调用父类的办法时,会用到Super关键 字. Super指向的是父类的指针,子类重写父类的 办法时,调用父类的办法是一个非常好的习惯。 因为当我们不知道父类在该办法中实现的功能 时,若是不调用父类的办法,有可能我们重写的 办法会落空该功能,这是我们不想看到的景象。
NSNull
NSNull是没有的意思,若是一个字典的值为 NSNull,那申明与该值对应的Key是没有值的,例 如Key为address,声明与address对应的是值是没有。
instancetype
自动识别当前类的对象 xcode 5
__kindof
表示相当于当前类或者他的子类
参考文档: