Неверное уменьшение счетчика ссылок объекта - PullRequest
0 голосов
/ 10 сентября 2011

Я не уверен, как бороться с выпуском этого объекта:

ч:

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

4 голосов
/ 10 сентября 2011

вы звоните релиз на nil.Либо удалите self.imageView=nil; (освобождает imageView и устанавливает его в ноль), либо [imageView release]; (только освобождает imageView, но вы не будете использовать его дальше, поэтому нет причин устанавливать его в ноль).

Редактировать:Как сказал @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];
0 голосов
/ 10 сентября 2011

В вашем методе dealloc есть две ошибки:

(1) Вы должны поставить [super dealloc] в качестве последней строки в вашей сделке

Если вы сначала вызовете [super dealloc], память, в которой находится ваш объект, будет освобождена (и, возможно, использована чем-то другим). После этого вы не можете использовать членов вашего объекта, они больше не ваши!

(2) Рекомендуется не использовать свойство в методе dealloc. Вы не знаете, что еще это может вызвать (другие объекты могут прослушивать через KVO, подклассы могли бы переопределить установщик, чтобы сделать что-то еще и т. Д.).

Ваш правильный dealloc должен выглядеть так:

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

Надеюсь, это поможет!

0 голосов
/ 10 сентября 2011

Во избежание проблем с выпуском и утечкой измените код метода dealloc следующим образом.

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

проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...