关于OC的property 和 实例变量思考

来源:互联网 发布:mac电脑铃声剪辑软件 编辑:程序博客网 时间:2024/06/12 22:06

区别一

property的是可以被外部访问的,当然也可以定义私有的property,

但是实例变量,外部是不可访问的。所以当我们的变量需要给外部访问的时候,可以定义property。

区别二

我们需要保存我们的数据,不要被提前dealloc的时候,可以使用property的setter,来retain多一次,等到使用完了再release,更好控制,使用实例变量的话,就只是一个指针,不会调用setter方法,容易被改变。

区别三

如果在操作中,我们仅仅是需要用到一个变量的地址,那么用实例变量就好,用self.property的话,虽然只是调用getter来的到指针,但是也绕多了一步,去调用getter才拿到指针。

补充

1》@property并不只是可以生成getter和setter方法,它还可以做内存管理。不过这里我暂不讨论、、也就是说

2》atomic是默认行为,assign是默认行为,readwrite是默认行为。

3》推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。

4》dealloc函数里面有这样的代码:self.xxx = nil;看到这里,现在你们明白这样写有什么用了吧?它等价于[xxx release];  xxx = [nil retain];(---如果你的property(nonatomic,retian)xxx,那么就会这样,如果不是,就对号入座吧)

因为nil可以给它发送任何消息,而不会出错。为什么release掉了还要赋值为nil呢?大家用c的时候,都有这样的编码习惯吧。

int* arr = new int[10];    然后不用的时候,delete arr; arr = NULL;  在objc里面可以用一句话self.arr = nil;搞定



 使用Analyze可以分析哪里有潜在内存泄露,可以根据需要进行修改。

原文

http://blog.csdn.net/jkay_wong/article/details/8996558