iOS 之属性方法的选取原则
来源:互联网 发布:mac怎么下载office 编辑:程序博客网 时间:2024/06/05 05:20
ios 中的property 就是自动生产get/set方法的时候使用的。
@property定义一个已经存在的属性
@synthesize实现具体的访问方法
retain:setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
assign:setter方法直接赋值,不进行任何retain操作,适合数值,不直接拥有的delegate对象
copy:setter方法进行copy操作,与retain处理流程一样,先旧值release,再copy出新对象,retainCount为1,这是为了减小对上下文的依赖而引入的机制,NSString可以使用,像NSArray如果没有实现-(id)copyWithZone:(NSZone*)zone该方法,只是浅复制。
readonly:这个属性变量就是表明变量只是可读方法,也就是说只能实现它的get方法
readWrite:拥有set/get方法
readonly和readWrite真正价值不是提供变量的访问接口,而是控制成员变量的访问权限
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能
atomic:原子性访问,线程安全
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
object-c有三种property accessors:assign,retain,copy,这里分别说明三种属性方法的实现和区别。
assign:就是简单的赋值。
这种方法对于传入的参数,没有做任何处理,无法保证传入的数据不会被release,所以一般的类对象,比如NSString,通常不会选择这种类型的方法。
但是非类数据,delegate,子view保存父view的句柄等等通常选择的是这个方法. int,bool之类的数据不必多说。这里说明下delegate为什么通常选择assign作为属性方法。假设有一个table controller上面有一个table,毫无疑问的,controller会retain住这个table,并在dealloc中release这个table,如果table的delegate是这个controller,并且也retain了它。那么controller就只有在cell被dealloc时才会被release,这就导致了循环引用。
子view保存父view也是同样的道理,只能使用assign。
assign的具体实现看下面:
- (SomeVariable)someValue
{
return someValue;
}
- (void)setSomeValue:(SomeVariable)aSomeVariableValue
{
someValue = aSomeVariableValue;
}
retain方法:赋值的基础上,retain传入的数据
先看一种具体的实现(编译器自动生成的未必如此,但是原理是一样的):
- (void)setSomeInstance:(SomeClass*)aSomeInstanceValue
{
if(someInstance == aSomeInstanceValue)
{
return;
}
SomeClass*oldValue = someInstance;
someInstance = [aSomeInstanceValueretain];
[oldValuerelease];
}
- (SomeClass*)someInstance
{
return[[someInstanceretain]autorelease];
}
这里需要注意的是首先set方法中首先比较了数据是否相同。
copy方法:拷贝生成了一份的数据
之所以需要copy方法,先看下面的例子,
NSMutableString*mutableString = [NSMutableStringstringWithString:@"initial value"];
[someObject setStringValue:mutableString];
[mutableString setString:@"different value"];
someObject完全无法得知传入的数据发生了变化,最典型的例子就是NSDictionary,
比如,NSDicionary的key,通常是一个NSString,如果这个NSString是NSMutableString,那么这个key就可能发生变化,NSDicionay就可能无法找到这个key对应的value,造成memory leak,所以NSDictioary的key的属性方法,使用的就是copy。
- iOS 之属性方法的选取原则
- 域名选取的原则
- 索引关键字的选取原则
- sql的索引选取原则
- seo关键词的选取原则,关键词的拓展方法,关键词的分析筛选
- 核心关键词选取的三大原则
- IOS学习笔记之属性方法的选择
- IOS学习笔记之属性方法的选择
- iOS开发之category动态添加属性的方法------关联
- 随机选取weblist的方法
- 选取不同随机数的方法
- ios之选取器与标签栏
- iOS自定义控件之图像选取按钮
- iOS 之摄像头/相册选取图片
- jquery选取自定义属性所在的元素
- iOS runtime方法详解之属性操作
- 列选取原则
- 性能交易选取原则
- 云
- 使用VS2008编译OpenCV2.2.0源码
- 多线程内存模型及同步和互斥简介
- WP7 如何禁用WebBrowser 控件缩放和左右移动
- platform平台总结
- iOS 之属性方法的选取原则
- 漫谈程序员系列:怎样成为技术达人
- ScrollView下,对ListView和GridView的分发处理和滑动冲突
- Windows Phone 中WebBrowser打开新窗口
- Linux限制root不能直接登录方法
- iOS 之UUID和UDID
- 关于调用JS文件乱码问题处理方法
- 解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
- Windows phone 7 解析Html数据