iPhone - 使用class属性时发布崩溃

时间:2011-03-15 21:25:15

标签: iphone attributes crash release

简单的问题......

当我点击overlayController视图上的按钮时,为什么这个release会崩溃我的应用?

    OverlayViewController* overlayController = [[OverlayViewController alloc]
                                                initWithNibName:@"Overlay"
                                                         bundle:nil];
    self.picker.cameraOverlayView = overlayController.view;
    [overlayController release];

换句话说,如何在此viewDidLoad方法之外调用OverlayViewController方法?

奇怪......我不明白为什么我的应用程序正在运行: - )

3 个答案:

答案 0 :(得分:2)

好吧,我可以很容易地回答第二个问题:

  

如何在此viewDidLoad方法之外调用OverlayViewController方法?

只需在viewController中添加一个属性:

  

<强> MyViewController.h:

@interface MyViewController : UIViewController {
    OverlayViewController* overlayController;
}
@property (nonatomic, retain) OverlayViewController* overlayController;
@end
  

<强> MyViewController.m:

@implementation MyViewController
@synthesize overlayController;

- (void)viewDidLoad {
    OverlayViewController* ovc = [[OverlayViewController alloc]
                                   initWithNibName:@"Overlay" bundle:nil];
    self.overlayController = ovc;
    [ovc release];
    self.picker.cameraOverlayView = self.overlayController.view;
}

- (void)someOtherMethod {
    [self.overlayController someMethod];
}

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

@end

答案 1 :(得分:1)

  

set方法是否保留视图   属性

是的,但它不会保留overlayController[overlayController release]之后会很快取消分配。

为了能够调用overlayController方法,请将其保存在实例变量中。无论如何,你必须这样做,以避免崩溃和/或泄漏。

答案 2 :(得分:1)

您将overlayController的视图分配给您的属性,但之后释放整个控制器。只有在您指定了

之后,setter才会保留
@property(retain)NSArray * myArray;

如果这确实保留了视图,请查看cameraOverlayView的属性。