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

#iphone #objective-c #release #android-mapview #calayer

#iPhone #objective-c #выпуск #android-mapview #calayer

Вопрос:

У меня есть 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-файле. Мой VC никогда не освобождается.

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

Редактировать

  - (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.

Комментарии:

1. Действительно ли сохранены LocationManager и MapView? Я полагаю, что они просто добавлены как вложенные просмотры без сохранения, а затем [super viewDidUnload]; могут их освободить, и ваше освобождение приведет к сбою.

2. LocationManager = [[CLLocationManager alloc] init]; и @property (неатомный, сохранить) IBOutlet MKMapView *MapView;. Это правильный путь? И если [super viewDidUnload] освобождает объекты, я должен получить exc_bad_access в viewDidUnload? Ошибка возникает после viewDidAppear, но до того, как вы сможете фактически увидеть MapView (только сетку).

3. Вы не обязательно получаете исключение неправильного доступа при доступе к освобожденному объекту. Вы также можете либо получить сообщение, отправленное в освобожденный экземпляр с ошибкой, либо нераспознанный селектор , если новый объект теперь находится в этой ячейке памяти. Но теперь вы говорите, что сообщение приходит после viewDidAppear , поэтому вы должны показать нам этот метод вместо этого. viewDidUnload Метод вызывается, когда контроллер представления освобождает свои представления (очистка).

4. В viewDidAppear-методе ничего не написано. У меня просто была точка останова, чтобы посмотреть, была ли она вызвана. Я отредактирую свой вопрос и добавлю viewDidLoad-метод.

Ответ №1:

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

Комментарии:

1. Большое вам спасибо! Это была проблема! Прошу прощения за мою тупость — все еще учусь 🙂

2. @Erik Nolander: Всегда пожалуйста. Управление памятью — самая большая проблема при изучении Objective-C, но как только вы выучили и поняли правила, это на самом деле очень просто.

Ответ №2:

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