关于objective-c中的property和实例变量

首先,在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的时候,也不会滥用内存,也知道系统帮自己做了哪些事。

你可能感兴趣的:(iOSDev)