参考资料编程
http://blog.csdn.net/pingchangtan367/article/details/14000315数组
http://blog.csdn.net/xdrt81y/article/details/9720121安全
首先 @property 是声明对象用的 看这个列子,多线程
//in BaseClass.h @interface BaseClass : NSObject{ @public NSString *_name; } @property(nonatomic,copy) NSString *name; //in BaseClass.m @synthesize name = _name; @end BaseClass *base=[[BaseClass allow]init]; base.name(这样的花能够直接引用name) base._name(这样就是不能直接引用的)
@property起了一个修饰的做用 至于@property(....) 一系列的参数 就是对当前修饰对象的一个进一步内存上的修饰 函数
1.atomic 和 nonatomic性能
atomic是默认的属性,表示对对象的操做属于原子操做,主要是在多线程的环境下,提供多线程访问的安全。咱们知道在多线程的下对对象的访问都须要先上锁访问后再解锁,保证不会同时有几个操做针对同一个对象。若是编程中不涉及到多线程,不建议使用,由于使用atomic比nonatomic更耗费系统资源。atom
nonatomic 表示访问器的访问不是原子操做,不支持多线程访问安全,可是访问性能高。spa
2.readwrite 和readonly.net
readwrite 是默认的属性,表示能够对对象进行读和写,会生成对象相应的setter和getter方法。线程
readonly 表示只容许读取对象的值,只会生成对象的getter方法。
3.retain,assign和copy
retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增长一。
此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增长对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增长1)。
- (void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];
oldValue = [newValue retain];
}
}
assign 是默认属性,只能够对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操做。
copy 表示从新创建一个新的计数为1的对象,而后释放掉旧的值。
都知道retain是对指针的拷贝,copy是对内容的拷贝。好比:NSString 对象的地址为0x100,其内容为“string”,若是使用copy到另一个NSString对象,则会生成另一个地址为0x110的对象,只不过内容仍然是‘string“。若是使用retain到另一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.
4.strong 和 weak
在ARC的模式下,对象声明时须要加入strong和weak,方便内存的自动管理。默认状况下是strong类型。
strong 强引用,默认的属性,相似于retain,实际上是一个相对的概念,就是一个引用。若是有一个强引用持有该对象,则该对象就不能被释放。默认的全部实例变量和局部变量都是strong指针。
weak 弱引用,相似于assign,弱引用除了不决定对象的存亡外,其余与强引用相同。即便一个对象被持有无数个若引用,只要没有强引用指向他,那麽其仍是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。
weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,所以父亲是儿子的全部者;但为了阻止全部权循环,儿子须要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController经过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。
那么看看@property究竟干了什么??
仍是上面的Demo; @interface BaseClass : NSObject{ @public NSString *_name; } //@property(nonatomic,copy) NSString *name; -(NSString*) name; -(void) setName:(NSString*)newName; @end 把@property的定义注释掉了,另外定义了两个函数,name和setName,下面请看实现文件: //@synthesize name = _name; -(NSString*) name{ return _name; } -(void) setName:(NSString *)name{ if (_name != name) { [_name release]; _name = [name copy]; } } 如今,你再编译运行,同样工做的很好。why?由于我刚刚作的工做和先前声明@property所作的工做彻底同样。@prperty只不过是给编译器看的一种指令,它能够编译以后为你生成相应的getter和setter方法。并且,注意看到面property(nonatomic,copy)括号里面这copy参数了吗?它所作的事就是_name = [name copy];或者上面一系列的参数
Property定义:@property 声明用于自动建立property属性变量的getter和setterSynthesize定义:@Synthesize声明实现了property属性变量的getter和setter。