[Выпуск CALayer]: сообщение отправлено освобожденному экземпляру в UIViewController.

У меня есть MapView в UIViewController. Когда я пытаюсь загрузить представление после его viewDidUnload, оно вылетает с этим сообщением:

-[Выпуск CALayer]: сообщение отправлено освобожденному экземпляру 0x29aea0

Я думаю, что делаю все необходимые вещи, которые я должен сделать в viewDidUnload:

- (void)viewDidUnload {

    [super viewDidUnload];

    locationManager.delegate = nil;
    [locationManager release];
    locationManager = nil;

    mapView.delegate = nil;
    [mapView release];
    mapView = nil;
}

Мой MapView находится в UIView, настроенном в xib-файле. Мой ВК никогда не освобождается.

Я уже некоторое время гуглю, но не могу найти ответ.

Изменить

 - (void)viewDidLoad {

    [super viewDidLoad];

    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate:self];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locationManager startUpdatingLocation];

    [label setFont:[UIFont fontWithName:@"Sansation" size:28]];
    [label setShadowOffset:CGSizeMake(0, 1)];
    [label setShadowColor:[UIColor grayColor]];
    self.navigationItem.titleView = labelView;
    [label release];
    [labelView release];

    UIBarButtonItem *checkInButton = [[UIBarButtonItem alloc] initWithTitle:@"Checka In" style:UIBarButtonItemStylePlain target:self action:@selector(checkIn)];
    [[self navigationItem] setRightBarButtonItem:checkInButton];
    [checkInButton release];

    UIBarButtonItem *clueListButton = [[UIBarButtonItem alloc] initWithTitle:@"Ledtrådar" style:UIBarButtonItemStylePlain target:self action:@selector(cluesDown)];
    [[self navigationItem] setLeftBarButtonItem:clueListButton];
    [clueListButton release];

    UINavigationBar *bar = [self.navigationController navigationBar]; 
    [bar setTintColor:[UIColor colorWithRed:0.06 green:0.58 blue:0.88 alpha:1]]; 
}

«labelView» и «label» — это IBOutlets.


person Erik Nolander    schedule 02.05.2011    source источник
comment
Сохраняются ли действительно locationManager и mapView? Я предполагаю, что они просто добавлены как подпредставления без сохранения, а затем [super viewDidUnload]; может их освободить, а ваше освобождение приведет к сбою.   -  person DarkDust    schedule 02.05.2011
comment
locationManager = [[CLLocationManager alloc] init]; и @property (неатомарное, сохраняемое) IBOutlet MKMapView *mapView;. Это правильный путь? И если [super viewDidUnload] освобождает объекты, я должен получить exc_bad_access в viewDidUnload? Ошибка возникает после viewDidAppear, но до того, как вы действительно сможете увидеть mapView (только сетку).   -  person Erik Nolander    schedule 02.05.2011
comment
Вы не обязательно получите исключение плохого доступа при доступе к освобожденному объекту. Вы также можете получить сообщение об ошибке сообщение, отправленное освобожденному экземпляру, или неопознанный селектор, если новый объект теперь находится в этом месте памяти. Но теперь вы говорите, что сообщение приходит после viewDidAppear, так что вы должны вместо этого показать нам этот метод. Метод viewDidUnload вызывается, когда контроллер представления освобождает свои представления (очистка).   -  person DarkDust    schedule 02.05.2011
comment
В методе viewDidAppear ничего не написано. У меня просто была точка останова, чтобы увидеть, была ли она вызвана. Я отредактирую свой вопрос и добавлю метод viewDidLoad.   -  person Erik Nolander    schedule 02.05.2011


Ответы (2)


Поскольку вы не выделили и не сохранили label и labelView в своем методе viewDidLoad, вы не можете освобождать их здесь (вы их освобождаете).

person DarkDust    schedule 02.05.2011
comment
Большое спасибо! Это была проблема! Прошу прощения за мою нубиность - все еще учусь :) - person Erik Nolander; 02.05.2011
comment
@Erik Nolander: Пожалуйста. Управление памятью — самая большая проблема при изучении Objective-C, но как только вы изучили и поняли правила, все становится очень просто. - person DarkDust; 02.05.2011

Потому что вы сделали несколько нежелательных выпусков, таких как возвращаемое значение метода класса. вы можете освободить все объекты переобучения в -(void)dealloc

person user501836    schedule 18.05.2012