Вызов метода release приводит к сбою приложения iOS - PullRequest
0 голосов
/ 07 сентября 2011

Я выделил UIView в качестве панели инструментов и добавил все виды кнопок и других представлений в класс.Теперь, в моем заголовке ViewController у меня есть это:

@interface GridViewController : UIViewController <UIWebViewDelegate, UIScrollViewDelegate> {
    Toolbar *toolbar;
}

@property (retain) Toolbar *toolbar;

и в реализации у меня есть это:

@synthesize toolbar;

- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect toolbarRect = CGRectMake(0, 0, 1024, 40);
    self.toolbar = [[Toolbar alloc] initWithFrame:toolbarRect];
    [self.view addSubview:toolbar];
}

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

Теперь, если я запускаю анализ, это в основном говорит, что у меня естьпотенциальная утечка памяти.Если я добавлю [релиз панели инструментов];сразу после вызова addSubView: панель инструментов, как я обычно делаю при добавлении подпредставлений, приложение вылетает, когда я открываю ViewController.

Что я делаю не так?Я попытался прочитать все об управлении памятью, и в соответствии с этим вам всегда нужно выпускать / автоматически освобождать то, что вы выделяете / копируете / сохраняете и т. Д. Если я смотрю на свой код, я сохраняю переменную экземпляра в заголовке, а такжевыделяя его в реализации, так что счетчик удержания должен быть +2, и поэтому мне нужно было бы выпустить его дважды, но, похоже, я что-то неправильно понял.Любая помощь очень ценится.

Когда я говорю крах, я получаю это: Xcode делает паузу и говорит, что EXC_BAD_ACCESS для этой строки в main.m

int retVal = UIApplicationMain(argc, argv, nil, nil);

и в консоли я получаю это:

modifying layer that is being finalized - 0x60895f0 

Ответы [ 2 ]

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

Кажется, что проблема была на самом деле в классе панели инструментов, а не в ViewController.Я не использовал сеттеры для иваров, и поэтому он начал ломаться.

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

Если для свойства self.toolbar установлено значение (retain), это предполагает, что после строки self.toolbar = [[Toolbar alloc] initWithFrame: toolbarRect]; счет сохранения должен составлять +2. Я бы предложил заменить эту строку на self.toolbar = [[[Toolbar alloc] initWithFrame: toolbarRect] autorelease], чтобы сохранить счет на уровне 1. Это, вероятно, должно исправить это, так как сохранение, полученное из addSubview, не управляется вами, и вы отпускаете toolbar в dealloc.

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

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