对象引用计数的减少不正确

时间:2011-09-10 12:45:45

标签: iphone objective-c memory-management

我不知道如何处理释放这个对象:

H:

@interface AHImageView : UIScrollView
{
UIImageView *imageView;
}
@property (nonatomic, retain) UIImageView *imageView;

的.m:

-(id)initWithFrame:(CGRect)frame {
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

 [self addSubview:self.imageView];
}

-(void)dealloc {
    [super dealloc];
    self.imageView = nil;
    [self.imageView release];
}

我得到的错误是:

  

对象的引用计数的不正确减少   此时由来电者拥有

此错误指向[self.imageView release];行。

3 个答案:

答案 0 :(得分:4)

您正在nil致电发布。删除self.imageView=nil;(释放imageView并将其设置为nil)或[imageView release];(仅释放imageView,但不会进一步使用它,因此没有理由将其设置为nil)。

编辑: 正如@Bavarious所说,这里有泄漏:

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];

答案 1 :(得分:0)

为了避免释放和泄漏问题,请修改dealloc方法的代码。

-(void)dealloc
{    
    [imageView release];
    self.imageView = nil;
    [super dealloc];
}

问题解决了。

答案 2 :(得分:0)

你的dealloc方法有两个错误:

(1)您应该将[super dealloc]作为最后行放在您的dealloc中

如果先调用[super dealloc],那么您的对象所在的内存将被释放(并可能被其他内容使用)。在那之后,你不能使用你的对象的成员,他们不再是你的了!

(2)最好不要在dealloc方法中使用属性。你不知道这会导致什么(其他对象可能通过KVO监听,子类可能已经覆盖了setter来做其他事情等)。

你正确的dealloc应该是这样的:

- (void)dealloc {
    [imageView release];
    [super dealloc];
}

希望有所帮助!