iPhone - сбой при использовании атрибута класса - PullRequest
2 голосов
/ 16 марта 2011

Простой вопрос ...

Почему это release вызывает сбой моего приложения, когда я нажимаю кнопку, которая находится в представлении overlayController?

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

Сказал иначе, какМожно ли вызывать методы OverlayViewController вне этого метода viewDidLoad?

Странно ... Я не понимаю, почему мое приложение работает: -)

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Хорошо, я могу ответить на второй вопрос достаточно легко:

Как можно вызывать методы OverlayViewController вне этого метода viewDidLoad?

Просто добавьте свойство вваш 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 голос
/ 16 марта 2011

Вы назначаете представление overlayController для своего свойства, но впоследствии освобождаете весь контроллер.Установщик сохраняет только если вы указали это как

@property(retain)NSArray * myArray;

Посмотрите на свойство cameraOverlayView, если это действительно сохраняет представление.

1 голос
/ 16 марта 2011

Не сохраняет ли заданный метод представление атрибут

Да, но он не сохраняет overlayController, который будет счастливо освобожден после [overlayController release].

Для возможности вызова overlayController методы сохраняют его в переменной экземпляра. Вы должны сделать это в любом случае, чтобы избежать сбоев и / или утечек.

...