问题是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
答案 0 :(得分:2)
是的,你在所有方面都是正确的:
insertSubView:
的调用应保留您传递的mapView。 答案 1 :(得分:2)
作为一项规则,您不应该担心另一个对象是否或如何保留您提供的实例。这取决于要处理的对象;您只需要担心确保以后要直接访问的实例被保留。不要依赖其他对象来保留为您保留的实例。
在您的示例中,您有一个可以访问MapViewController的实例(mapView),但MapViewController没有它自己的保留。 self.view可以出于任何原因随时释放mapView,并且你突然间会有不良记忆。
答案 2 :(得分:2)
- (void)dealloc {
//[mapView dealloc];
[super dealloc];
}
您应永远直接致电dealloc
(在方法结束时保存[super dealloc];
)。在大多数情况下,这肯定会导致崩溃。