【问题标题】:iPhone - release crash when using a class attributeiPhone - 使用类属性时释放崩溃
【发布时间】:2011-07-16 03:39:30
【问题描述】:

简单的问题...

为什么当我单击 overlayController 视图上的按钮时,release 会使我的应用程序崩溃?

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

换一种说法,在这个viewDidLoad方法之外怎么调用OverlayViewController方法呢?

奇怪...我不明白为什么我的应用可以运行 :-)

【问题讨论】:

  • 当崩溃发生时你的控制台会说什么?您是否尝试过“构建和调试”而不是“构建和运行”来查看崩溃发生时的堆栈跟踪?您是否在每行代码之间添加了NSLog(@"x"); 行以查看实际导致崩溃的行?
  • @e.James :是版本导致了崩溃,但我弄错了原因。见编辑。控制台什么也没说
  • 酷。那么我的回答实际上会解决它。见下文! :)
  • 总而言之,您正在创建然后释放overlayController 对象,因此它不会留下来。当您单击按钮时,overlayController 已被释放。按钮事件将被发送到未定义的内存块,您的应用将崩溃。

标签: iphone attributes crash release


【解决方案1】:

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

如何在 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

【讨论】:

    【解决方案2】:

    set方法不保留视图吗 属性

    是的,但它不保留overlayController,它将在[overlayController release] 之后愉快地释放。

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

    【讨论】:

      【解决方案3】:

      您将 overlayController 的视图分配给您的属性,但之后释放整个控制器。设置器仅在您指定这样的情况下才会保留

      @property(retain)NSArray * myArray;
      

      看看cameraOverlayView的属性是否真的保留了view。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多