UIAlertViewDelegate在单独的类崩溃应用程序中

时间:2012-10-10 10:18:37

标签: objective-c ios delegates uialertview nsobject

UIAlertViewViewController以外的OK代表团遇到了困难。 一切都很好,直到用户点击Thread 1: EXC_BAD_ACCESS (code=2, address 0x8) 按钮 - 然后应用程序崩溃

#import <UIKit/UIKit.h>
#import "DataModel.h"

@interface ViewController : UIViewController
@end

ViewController.h:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad
{
    DataModel *dataModel = [[DataModel alloc] init];
    [dataModel ShowMeAlert];

    [super viewDidLoad];
}
@end

ViewController.m:

#import <Foundation/Foundation.h>

@interface DataModel : NSObject <UIAlertViewDelegate>
- (void)ShowMeAlert;
@end

DataModel.h

#import "DataModel.h"

@implementation DataModel
- (void)ShowMeAlert;
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Info" message:@"View did load!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

#pragma mark - UIAlertView protocol

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSLog(@"Index: %d", buttonIndex);
}

@end

DataModel.m

ViewController
  • 如果显示提醒及其委派方法的代码位于UIAlertDelegation - 完美无缺。
  • 当我删除...didDismissWithButtonIndex...方法UIAlertView delegate时 - 没有授权的工作。
  • 当我将nil设置为{{1}}时 - 没有授权就可以工作。

任何线索有什么问题?

1 个答案:

答案 0 :(得分:8)

在这种方法中:

- (void)viewDidLoad
{
  DataModel *dataModel = [[DataModel alloc] init];
  [dataModel ShowMeAlert];

  [super viewDidLoad];
}

您正在分配一个DataModel局部变量,该变量将在范围末尾由ARC释放。因此,当执行解雇时,您的代表不再存在。解决此问题的方法是将DataModel存储在视图控制器的strong属性中。这样它就不会被解除分配。你会这样做:

- (void)viewDidLoad
{
  self.dataModel = [[DataModel alloc] init];
  [self.dataModel ShowMeAlert];

  [super viewDidLoad];
}