1

我有一个用我正在合成的保留属性定义的属性:

@property (nonatomic, retain) UISwitch *mySwitch;

在我的 loadView 中,我正在这样做:

self.mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];

最后在我的 dealloc 中,我正在这样做:

self.mySwitch = nil;

因为我使用了一个分配器,所以我是否泄漏了这个对象(mySwitch)?我应该在分配框架时自动释放它吗?

请建议。

4

4 回答 4

4

该行:

self.mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];

实际上调用保留两次- 一次是alloc在分配给时self.mySwitch(这是您指定的属性,应该retain分配给它的任何值。)我被告知最好的解决方法是autorelease在线上添加一个调用,使它:

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)] autorelease];
于 2011-02-23T23:21:53.773 回答
2

是的,你在泄漏。您正在创建一个拥有的对象+alloc/-initWithFrame:,然后将该拥有的对象分配给标记为 的属性retain。这将创建对该对象的第二个拥有的引用。此时,您泄漏了原始拥有的引用,这会导致对象本身泄漏。

这里的正确行为是-autorelease在将对象分配给属性之前调用它。

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)] autorelease];

顺便说一句,不建议您访问-dealloc. 通常为此给出的两个原因是 1) 这将广播 KVO 通知,您不希望在-dealloc. 推荐的方法是简单地释放底层 ivar,因此您会看到类似以下内容:

[mySwitch release];

将 nil 分配给该属性在其他任何地方都非常安全(并且推荐)。

于 2011-02-23T23:21:56.503 回答
1

作为自动释放的替代方案,如果您需要更严格的内存管理,这应该适合您:

UISwitch *myswitch_tmp= [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];
self.mySwitch = myswitch_tmp;
[myswitch_tmp release];

后来例如在dealloc中

[mySwitch release];
于 2011-02-24T00:00:35.360 回答
-4

是的。您正在泄漏对象。在这里记住一个简单的规则:

如果你用过+alloc总有一定是对应-release的。

于 2011-02-23T23:22:13.900 回答