我目前正在开发一个由其他开发人员启动的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方法中发布变量,就像我一样。
非常感谢!
答案 0 :(得分:2)
因为它直接将实例变量分配给分配的对象,所以它的保留计数为1(因为,就像你说的那样,不会调用setter)。 因为它是以dealloc发布的,所以它都是平衡的。所以没有内存泄漏。
所以在我的项目中,这一行会导致泄漏:
myVar = [[NSString alloc] init]; (alloc / init +1,保留在setter +1中,以dealloc -1 => +1发布)
不,它甚至不会在你的项目中,因为正如你所指出的那样,没有使用setter。
此外,在使用属性时,建议直接在init方法中访问实例变量,而不是使用setter。
要检查可疑的内存泄漏,例如,请使用clang静态分析仪或仪器的泄漏工具。
答案 1 :(得分:0)
您需要查看其他开发人员的setter实现。确保它们释放现有值并保留新值;类似的东西:
- (void)setMyString:(NSString *)string
{
[string retain];
[_string release]; // ivar
_string = string;
}
实现自己的setter / getter方法的唯一好处是在设置值时执行某些操作(除了设置ivar)。如果方法不做这样的事情那么为什么不将所有实现改为@property/@synthensize
?