2013-03-11 2 views
0

я устанавливаю делегата в UIAlertView следующим образом:UIAlertView делегат сбой приложения

PhotoViewController *controller = [[PhotoViewController alloc] init]; 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Announcement" 
         message: @"It turns out that you are playing Addicus!" 
         delegate: controller 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 

Где PhotoViewController не ток UIviewContorller. Настороже нагрузки нормально, но как только я нажимаю на кнопку ОК, то происходит сбой приложения, и я получаю эту ошибку:

0x3a61a5b0: LDR r3, [r4, # 8] EXC BAD ACCESS

Что делает это имею в виду?

EDIT:

+ (DejalActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)aLabelWidth; 
{ 
// Immediately remove any existing activity view: 
if (dejalActivityView) 
    [self removeView]; 

// Remember the new view (so this is a singleton): 
dejalActivityView = [[self alloc] initForView:addToView withLabel:labelText width:aLabelWidth]; 

if ([labelText isEqualToString:@"Uploading photo (this process might take a while)"]) { 
buttonCancel = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[buttonCancel addTarget:dejalActivityView 
       action:@selector(callCancelAlert:) 
     forControlEvents:UIControlEventTouchDown]; 
buttonCancel.frame = CGRectMake(230, 540, 265, 40); 
[addToView addSubview:buttonCancel]; 
[buttonCancel setImage:[UIImage imageNamed:@"socialize-navbar-bg.png"] forState:UIControlStateNormal]; 
[buttonCancel setTitle:@"Cancel upload" forState:UIControlStateNormal]; 
} 

return dejalActivityView; 
} 

-(IBAction)callCancelAlert:(id)sender{ 

PhotoViewController *controller = [[PhotoViewController alloc] init]; 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Announcement" 
         message: @"It turns out that you are playing Addicus!" 
         delegate: controller 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 
//[alert release]; 
} 
+1

Является ли это точной копией вашего кода? Если нет, а 'controller' является' слабым', тогда он может быть установлен на nil, прежде чем вы сможете его использовать. В любом случае, проверьте, не контролируется ли контроллер в отладчике. Все самое лучшее – virtualnobi

+0

Да, это код. И это единственная ссылка, которую я должен контролировать, а также #import «PhotoViewController» – Alessandro

+0

Совет: делегат не сохраняется alertView; –

ответ

4

Делегаты не сохраняются свойства. Это означает, что когда controller выходит из сферы действия, ARC освободит его и, поскольку он не был сохранен другим объектом, он будет освобожден. Когда представление предупреждения пытается отправить сообщение своему делегату, адрес больше недействителен и вы получите исключение.

Делегат представления предупреждения должен проживать дольше, чем сам вид предупреждения. Обычно объект, создающий представление предупреждения, должен быть делегатом. Вы должны переместить код делегата в класс, который создает представление предупреждения.