0

我目前正在开发一个由另一位开发人员启动的 iOS 应用程序。

通常,我为每个实例变量创建一个属性(为 int、bool 等赋值/为所有类保留)。

所以在我的项目中,这条线会导致泄漏:

myVar = [[NSString alloc] init]; (alloc/init +1, retain in setter +1, release in dealloc -1 => +1)

所以我使用:

NSString *tmpMyVar = [[NSString alloc] init];
[self setMyVar: tmpMyVar];
[tmpMyVar release];

或者:

NSString *tmpMyVar = [[[NSString alloc] init] autorelease];
[self setMyVar: tmpMyVar];

在这个新项目中,之前的开发人员没有使用@property/@synthesize,所以我想知道在这种情况下上一行代码的结果是什么(我猜它不会调用setter)?内存泄漏?

以前的开发者在dealloc方法中释放变量,和我一样。

非常感谢!

4

2 回答 2

2

因为它直接将实例变量分配给分配的对象,所以它的保留计数为 1(因为,就像你说的,没有调用 setter)。而且因为它是在 dealloc 中释放的,所以一切都平衡了。所以没有内存泄漏。

所以在我的项目中,这条线会导致泄漏:

myVar = [[NSString alloc] init]; (alloc/init +1,在 setter +1 中保留,在 dealloc -1 中释放 => +1)

不,它甚至不会在你的项目中,因为正如你所指出的,没有使用 setter。

此外,在使用属性时,建议直接在 init 方法中访问实例变量,而不是使用 setter。

要检查像您的示例那样有问题的内存泄漏,还可以使用 clang 静态分析器或仪器的泄漏工具。

于 2012-08-21T09:02:47.353 回答
0

您需要查看其他开发人员的 setter 实现。确保他们释放现有值并保留新值;就像是:

- (void)setMyString:(NSString *)string
{
    [string retain];
    [_string release];    // ivar
    _string = string;
}

实现自己的 setter/getter 方法的唯一好处是在设置值时做一些事情(除了设置 ivar)。如果这些方法没有做这样的事情,那么为什么不将所有实现更改为@property/@synthensize

于 2012-08-21T09:05:22.807 回答