Iphone 对象的引用计数的减量不正确
我不确定如何处理释放此对象: h: .m: 我得到的错误是: 不正确的对象引用计数递减率不是 此时由调用方拥有Iphone 对象的引用计数的减量不正确,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我不确定如何处理释放此对象: h: .m: 我得到的错误是: 不正确的对象引用计数递减率不是 此时由调用方拥有 此错误指向[self.imageView版本]行。您在nil上调用release。移除self.imageView=nil(释放imageView并将其设置为零)或[imageView释放](仅释放imageView,但您不会进一步使用它,因此没有理由将其设置为nil) 编辑: 正如@Bavaried所说,这里有一个漏洞: self.imageView = [[UIImageView
此错误指向
[self.imageView版本]代码>行。您在nil
上调用release。移除self.imageView=nil代码>(释放imageView并将其设置为零)或[imageView释放]代码>(仅释放imageView,但您不会进一步使用它,因此没有理由将其设置为nil)
编辑:
正如@Bavaried所说,这里有一个漏洞:
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
你应该这样称呼它:
self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
您在nil
上调用release。移除self.imageView=nil代码>(释放imageView并将其设置为零)或[imageView释放]代码>(仅释放imageView,但您不会进一步使用它,因此没有理由将其设置为nil)
编辑:
正如@Bavaried所说,这里有一个漏洞:
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
你应该这样称呼它:
self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
为了避免释放和泄漏问题,修改dealoc方法的代码如下
-(void)dealloc
{
[imageView release];
self.imageView = nil;
[super dealloc];
}
问题已解决。为了避免释放和泄漏问题,请修改dealoc方法的代码,如下所示
-(void)dealloc
{
[imageView release];
self.imageView = nil;
[super dealloc];
}
问题已解决。您的dealloc方法中有两个错误:
(1) 您应该将[super dealoc]
作为dealoc中的最后一行
如果您首先调用[super dealoc]
,对象所在的内存将被释放(可能会被其他对象使用)。在那之后,你不能使用你对象的成员,他们不再是你的了
(2) 最好不要在dealloc方法中使用属性。您不知道这还会导致什么情况发生(其他对象可能正在通过KVO侦听,子类可能已重写setter以执行其他操作等)
正确的dealloc应该如下所示:
- (void)dealloc {
[imageView release];
[super dealloc];
}
希望有帮助 您的dealloc方法中有两个错误:
(1) 您应该将[super dealoc]
作为dealoc中的最后一行
如果您首先调用[super dealoc]
,对象所在的内存将被释放(可能会被其他对象使用)。在那之后,你不能使用你对象的成员,他们不再是你的了
(2) 最好不要在dealloc方法中使用属性。您不知道这还会导致什么情况发生(其他对象可能正在通过KVO侦听,子类可能已重写setter以执行其他操作等)
正确的dealloc应该如下所示:
- (void)dealloc {
[imageView release];
[super dealloc];
}
希望有帮助 该行完全不必要该行完全不必要请注意,他正在泄漏self.imageView
--initWithFrame:
返回一个已分配给retain
属性的拥有对象。若要添加到您的答案,必须在dealloc方法中将其设置为nil<代码>self.imageView=nil代码>如果在发布后设置为nil,则其为OK。但在发布之前,您不能将其设置为nil…暂时忘记其他一切,[self.imageView release]代码>本身会导致引用计数的不正确递减,因为它是。它应该是[imageView release]
。那么我应该将任何属于retain属性的内容自动删除吗?例如,我还有一个需要释放的保留nsmutablearray,但当我将释放代码放入dealloc时,会出现相同的错误。请注意,他正在泄漏self。imageView
--initWithFrame:
返回分配给retain
属性的自有对象。要添加到您的答案中,在dealloc方法中必须将其设置为nil<代码>self.imageView=nil代码>如果在发布后设置为nil,则其为OK。但在发布之前,您不能将其设置为nil…暂时忘记其他一切,[self.imageView release]代码>本身会导致引用计数的不正确递减,因为它是。它应该是[imageView release]
。那么我应该将任何属于retain属性的内容自动删除吗?例如,我还有一个需要释放的保留nsmutablearray,但是,当我将发布代码放入dealloc时,也会出现同样的错误。您在哪里看到属性不能在dealloc中使用?这里:-标题为“不要在初始值设定项方法和dealloc中使用访问器方法”的部分,但是它们没有在那里详细介绍,所以这个线程也非常有趣:您在哪里看到这些属性无法在dealloc中使用?此处:-标题为“不要在Initializer方法和dealloc中使用访问器方法”的部分,但它们没有详细介绍,因此此线程也非常有趣:我冒昧地为您改进了格式。您可能想看看。我冒昧地为您改进了格式。你可能想看一看。