首先,在objective-c中,并没有真正的property,使用self.property只是调用函数的一种精简写法,就是调用property的getter和setter方法罢了。
如果定义了一个retain的属性
@property (nonatomic, retain) NSMutableDictionary *imageScaleDict;
然后在代码中对该属性进行下面的操作进行初始化
self.imageScaleDict = [[NSMutableDictionary alloc] init];
这里首先使用init使得后面的内存申请了一块内存,reference count为1,然后又调用了imageScaleDict的setter方法,在setter中会retain多一次,就像下面的setter方法这样
- (void)setImageScaleDict:(NSMutableDictionary *)imageScaleDict
{
if(_imageScaleDict != imageScaleDict) {
[_imageScaleDict release];
[imageScaleDict retain];
_imageScaleDict = imageScaleDict;
}
}
所以这个时候_imageScaleDict指向的内存reference count已经是2了,
但是我只在最后的dealloc中[_imageScale release],这样这块内存的reference count还是1,这块内存并不会被回收。
所以正确的做法就是,在初始化的时候不要调用_imageScaleDict中的setter方法。
_imageScaleDict = [[NSMutableDictionary alloc] init];
这样_imageScaleDict指向的内存reference count只有1,最后release就回收这块内存了
什么时候使用property 什么时候使用实例变量
首先,我们知道的就是property的是可以被外部访问的,当然也可以定义私有的property,但是实例变量,外部是不可访问的。
所以当我们的变量需要给外部访问的时候,可以定义property。
还有就是党我们需要保存我们的数据,不要被提前dealloc的时候,可以使用property的setter,来retain多一次,等到使用完了再release,更好控制,使用实例变量的话,就只是一个指针,不会调用setter方法,容易被改变。
如果在操作中,我们仅仅是需要用到一个变量的地址,那么用实例变量就好,用self.property的话,虽然只是调用getter来的到指针,但是也绕多了一步,去调用getter才拿到指针。
使用Analyze可以分析哪里有潜在内存泄露,可以根据需要进行修改。
现在也意识到学习手动管理的必要性,只有手动管理过了才会对objective-c和iOS有更加清晰的认识,就算是使用ARC的时候,也不会滥用内存,也知道系统帮自己做了哪些事。