Управление памятью: сохраняет ли insertSubview свои представления? - PullRequest
1 голос
/ 27 октября 2010

Вопрос в том, сохраняет ли insertSubview представления и правильно ли я делаю.

Я бы сказал, да. Так как я больше не использую собственность, я не получаю EXC_BAD_ACCESS. Я думаю, что при выпуске представления все подпредставления также освобождаются. И поэтому mapView переиздан. Я прав или у меня все еще есть проблема с управлением памятью?

My ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MapViewController : UIViewController <MKMapViewDelegate> {

MKMapView *mapView;
// ...
}

//@property (nonatomic, retain) MKMapView *mapView;
// ...

@end

My ViewController.m

#import "MapViewController.h"

@implementation MapViewController

//@synthesize mapView;

- (void)viewDidLoad {
    [super viewDidLoad];

    //self.mapView=[[[MKMapView alloc] initWithFrame:self.view.bounds] autorelease];
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

    [self.view insertSubview:mapView atIndex:0];
    [mapView release];

    // ...
}

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

@end

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

Как правило, вам не нужно беспокоиться о том, будет ли другой объект сохранять экземпляр, который вы ему предоставляете. Это зависит от этого объекта; вам нужно только позаботиться о том, чтобы экземпляр, к которому вы собираетесь обратиться напрямую, был сохранен. Не полагайтесь на другой объект, чтобы сохранить экземпляр для вас.

В вашем примере у вас есть экземпляр (mapView), который доступен для MapViewController, но MapViewController не имеет своего собственного хранилища для него. self.view может выпустить mapView в любое время по ряду причин, и у вас внезапно появится плохая память.

2 голосов
/ 27 октября 2010
- (void)dealloc {
    //[mapView dealloc];
    [super dealloc];
}

Вы должны никогда вызывать dealloc напрямую (за исключением [super dealloc]; в конце метода). Это наверняка вызовет сбой в большинстве ситуаций.


Так как это не источник вашего сбоя, у вас где-то есть переизбыток. Используйте инструмент обнаружения зомби, чтобы выяснить, где.
2 голосов
/ 27 октября 2010

Да, вы правы по всем пунктам:

  1. вызов insertSubView: должен сохранить mapView, который вы передаете.
  2. освобождение вашей ссылки на mapView после добавления ее в родительское представление
  3. родительское представление освободит все сохраненные подпредставления, когда оно будет выпущено
...