@property (nonatomic,retain) IBOutlet UIWindow *window ;或者
@property (nonatomic,retain)中的nonatom和retain是什么意思:
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。
就编译器而言,IBOutlet并未执行任何操作。它的唯一作用是告诉Interface Builder,此实例变量将被连接到nib中的对象。你创建的任何需要连接到nib文件中的对象的实例变量都必须以IBOutlet关键字开头。打开Interface Builder时,它会在项目头文件中扫描此关键字,你可以根据这些(且只能根据这些)变量将代码连接到nib。
Properties (readonly,retain,nonatomic)
在头文件中用@property来声明属性:
@property float width;
@property float height;
@property Point center;
然后再实现中用@synthesize来让编译器产生getter和setter:
@synthesize width, height, center;
float leftEdge = self.center.x - self.width/2;
//将成员变量进行属性声明后,就可以通过“点操作”对成员变量进行读写操作了。
事实上,属性的更深刻的意义是在于:可读性;内存管理;线程处理。
可读性,一个属性默认是可读写的,如果加了readonly,则变为只读的。
内存管理,默认为assign,如果设置了retain,则通知编译器想分配给该属性的对象发送一个保留(retain)消息,这将确保属性底层的实例变量在使用过程中不会从内存中清除。
线程处理,默认生成的getter和setter是线程安全的。但由于大多数iphone application并不使用多线程,设置为nonatomic来得到一个不是线程安全但有比较高性能的实现。
(设置成nonatomic后,生成的getter和setter代码中没有互斥操作)
-(void)setString:(NSString *)test {
if (string != newString) {
[string release];
string = [newString retain];
}
}