Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 对象的引用计数的减量不正确_Iphone_Objective C_Memory Management - Fatal编程技术网

Iphone 对象的引用计数的减量不正确

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

我不确定如何处理释放此对象:

h:

.m:

我得到的错误是:

不正确的对象引用计数递减率不是 此时由调用方拥有


此错误指向
[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中使用访问器方法”的部分,但它们没有详细介绍,因此此线程也非常有趣:我冒昧地为您改进了格式。您可能想看看。我冒昧地为您改进了格式。你可能想看一看。