如何在@property ref属性中给属性附初始值

2013年8月 Web 开发大版内专家分月排行榜第一2010年2月 Web 开发大版内专家分月排行榜第一
2013年7月 Web 开发大版内专家分月排行榜第二2013年6月 Web 开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。16605人阅读
Objective-C(47)
&&&&& 我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值。但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量大大增加。幸好从OC 2.0开始,我们能让系统自动生成设置变量值的方法或获取变量值的方法,即系统会自动为我们生成setter/getter方法。这中功能减少了代码量,让我们有更多的精力放在程序的业务逻辑上。为了使设置变量值的功能更加完善,OC使用@property来标识属性。例如变量可分为只读变量,那么变量的属性为readonly。其中有些属性比较好区分,但还有一些属性assign、copy等属性却让人有些困惑。
&&&&&& 先说说采用@property的语法吧!变量的声明语法为:
@property(attribution)Vartype& Varname;//属性在()里来定义,然后是变量类型、变量名。
OC提供的属性有:
读写属性: (readwrite/readonly)以及(getter=name)、(setter=name)
setter语意:(assign/retain/copy)
原子性: (non)atomic
&&&&& 提醒一下,采用@property与自定义setter和getter方式其实是等价的,但是编译器会优先查找自动的setter/getter方法,如果找不到,就会使用@property对应的属性。例如:
&&&&&&& @propert(nonatomic ,copy)NSString *
&&&&&&& 这条语句等价于:
&&&&&& 完成setter方法为:
&&&&&&& -(void)setName:(NSString*)newName{
&&&&&&&&&&&&& if(newName!=name){
&&&&&&&&&&&&&&&&&&&& [name release];
&&&&&&&&&&&&&&&&&&&& name=[newName& copy];
&&&&&&&&&&&& }
&&&&&& 完成getter方法为:
&&&&&& -(NSString*)name{
&&&&&&&&&&&&&&
&&&&&& 下面详细来说明这些属性的差异
读写属性中,readwrite可以获取实例变量的值。对于@synthesize,编译器会自动为该变量生成getter和setter方法。而readonly表示只读变量,不能设置实例变量的值,编译器不会为其生成setter方法,因此需要进行初始化。而getter/setter=name,是为(getter)/(setter)方法使用name指定的名称,而不是实例变量名称。
setter语意assign/retain/copy 决定了以何种方式对数据成员赋予新值。对于Objective-C中的一般object,最好使用用retain。一些特别的object(例如:string)使用copy。
而assign关键字代表setter直接赋值,而不是复制或者保留它,更不需要进行引用计数。这种机制非常适合一些基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates((且一定要用assign,具体原因暂时不知道,读者看到这里可以留言给我,告诉我答案)。
这里声明一下,什么是基本基本类型呢? 基本类型就是gc(gc就是垃圾回收的意思)队形,并且只有基本数据类型是gc对象,其它都是非gc的。比如int,float等基本数据类型。而NSString是非gc类型,所以用assign就不适合,而推荐做法是NSString用copy。而类如NSArray,NSDate等其它objc类型,推荐用retain。
而copy与retain的具体区别为:copy其实是建立了一个相同的对象,而retain只是保存其对象,并且其计数值+1。
例如:一个NSString对象,地址为0×1000,内容为@”string”&
copy到另外一个NSString之后,地址为0×2000,内容相同,新的对象retain为1,旧有对象没有变化&
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,但是这个新对象的retain值+1,并释放旧的对象。
也就是说,retain是指针拷贝,copy是内容拷贝。
atomicity的默认值是atomic,读取函数为原子操作。atomic是保证读取变量是线程安全的,即它会保证每次getter和setter的操作都会正确的执行完毕,而不用担心其它线程在你get的时候set,可以说保证了某种程度上的线程安全。而nonatomic是不能保证线程安全的。但是nonatomic比atomic速度要快。这也是为什么property基本上都用nonatomic了。 最后加上一句,仅仅靠atomic来保证线程安全是不可能的,要写出线程安全的代码,还是需要有同步和互斥机制。
&&&&&& 1.readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。&
&&&&&& 2.默认的property行为有:atomic,assign,readwrite。
&&&&&&&& 如果这样使用:@property& BOOL _//代表这_flag有着atomic,assign,readwrite三种行为。所以我们一定要提防这种默认行为潜在的危险。如:
&&&&&&&& @property NSMutableArray *photoV//此时会有警告出现,因为NSMutableArray是一种obj类型,并且是&NSArray类型,根据前面的分析,最好采用retain。所以默认的assign会带来警告提示。
关于属性方面的知识还可以参考:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:797972次
积分:7762
积分:7762
排名:第1945名
原创:123篇
转载:35篇
评论:65条
(2)(2)(5)(8)(1)(1)(1)(1)(1)(1)(1)(4)(2)(5)(3)(12)(6)(8)(24)(26)(17)(33)property的默认属性
此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在中只需要一个读取器。或者如果你使用关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在中实现。如果使用关键字,读取器和设置器都会被解析。
此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用,且这个类符合协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。
指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core
Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core
Foundation对象都没有引用计数——译者注)。
它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。
指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。
所以property的属性默认是:readwrite,assign,
atomic(没有这个关键字)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&}

我要回帖

更多关于 property ref属性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信