内存管理:insertSubview是否保留了它的视图?

时间:2010-10-26 20:15:51

标签: iphone objective-c cocoa-touch memory-management subview

问题是insertSubview是否保留了观点以及我是否正确行事。

我会说是的。由于我不再使用该物业,因此我未收到EXC_BAD_ACCESS。我认为在发布视图时,所有子视图也会被释放。所以mapView被过度释放了。我是对的还是我还有内存管理问题?

我的ViewController.h

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

@interface MapViewController : UIViewController <MKMapViewDelegate> {

MKMapView *mapView;
// ...
}

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

@end

我的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 个答案:

答案 0 :(得分:2)

是的,你在所有方面都是正确的:

  1. insertSubView:的调用应保留您传递的mapView。
  2. 在将其添加到父视图后发布对mapView的引用
  3. 父视图将在发布时释放所有保留的子视图

答案 1 :(得分:2)

作为一项规则,您不应该担心另一个对象是否或如何保留您提供的实例。这取决于要处理的对象;您只需要担心确保以后要直接访问的实例被保留。不要依赖其他对象来保留为您保留的实例。

在您的示例中,您有一个可以访问MapViewController的实例(mapView),但MapViewController没有它自己的保留。 self.view可以出于任何原因随时释放mapView,并且你突然间会有不良记忆。

答案 2 :(得分:2)

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

您应永远直接致电dealloc(在方法结束时保存[super dealloc];)。在大多数情况下,这肯定会导致崩溃。


由于这不是崩溃的根源,因此您可以在某个地方进行过度释放。使用Instrument的Zombie Detection来确定在哪里。