IOS学习笔记之属性方法的选择

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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值