@property (nonatomic,retain,...)

@property (nonatomic,retain) IBOutlet UIWindow *window ;或者@property (nonatomic, retain) IBOutlet UIButton *myButton;

@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代码中没有互斥操作)


总结下:
@property(nonatomic,retain) NSString *test;
@synthesize test
1,这个操作在新版的xcode等于同时声名了成员变量test,并生成其getter\setter方法。
2,@property的retain等参数只是告诉编译器怎么生成(当初我理解成test和self.test是两个不同的指针)。
3,self.test=abc等于使用了@synthesize生成的setter,其过程有进行内存管理,不会造成内存泄漏,而test=abc则直接更改指针指向,所以尽量使用self.来赋值。
4,self.test=nil;等于执行了
 [test release];
[test=nil];

看一下@synthesize生成的setter是怎样工作的:
 
   

-(void)setString:(NSString *)test {

 
   

    if (string != newString) {

        [string release];

        string = [newString retain];

    }

}


你可能感兴趣的:(MAC)