区别一
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