#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