gpt4 book ai didi

iphone - 处理工厂方法中的内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:36 25 4
gpt4 key购买 nike

我正在开发一个 Objective-C 框架,该框架最终将作为静态库发布。但是当我在泄漏工具中将该库集成到实际应用程序(通过添加静态库)时,我发现存在一些内存泄漏。

这是一个示例场景。

@implementation Test

@synthesize testNumber

+(Test) createTestInstance {

Test *test = [[Test alloc] init];
test.testNumber = [[NSDecimerNumber alloc] initWithInt:1];

return test;
}

-(void) dealloc {
[testNumber release];
}

@end

尽管我在 dealloc 中释放了 testNumber 变量,但我在 alloc 位置的 Leaks 工具中看到了内存泄漏。这可能是什么问题?

此外,由于这是一个供用户调用的库,从库代码中释放这些变量是否是最佳实践?

谢谢

最佳答案

我在这里看到两个问题。如果 testNumber 是保留属性,则您使用以下语句过度保留了它:

test.testNumber = [[NSDecimerNumber alloc] initWithInt:1];

alloc-init 和属性访问器都在保留对象。因此,应该是:

test.testNumber = [[[NSDecimerNumber alloc] initWithInt:1] autorelease];

不用说,你还需要在dealloc方法中释放testNumber

另外,我知道 createTestInstance 是一个方便的构造函数来创建 Test 对象,它应该根据 Object Ownership Policy 返回一个自动释放的对象。 (只有名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法返回您拥有的对象):

+ (id)createTestInstance {

Test *test = [[[self alloc] init] autorelease];
test.testNumber = [[[NSDecimerNumber alloc] initWithInt:1] autorelease];

return test;
}

最后,正如@Josh Caswell 所建议的,便捷构造函数应该返回 id 而不是特定的类。来自 The Objective-C Programming Language :

The return type of convenience constructors is id for the same reason it is id for initializer methods, as discussed in “Constraints and Conventions.”

此外,他们应该使用 self 而不是硬编码的类名来分配初始化实例,以便正确处理子类化(self 这里指的是类对象本身,因为这是一个类方法)。

关于iphone - 处理工厂方法中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com