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

gut*_*ker 3 delegates objective-c nsobject uialertview ios

UIAlertView在课堂上的代表团遇到了困难ViewController.一切都很好,直到用户点击OK按钮 - 然后应用程序崩溃

Thread 1: EXC_BAD_ACCESS (code=2, address 0x8)
Run Code Online (Sandbox Code Playgroud)

ViewController.h:

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

@interface ViewController : UIViewController
@end
Run Code Online (Sandbox Code Playgroud)

ViewController.m:

#import "ViewController.h"

@interface ViewController ()
@end

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

    [super viewDidLoad];
}
@end
Run Code Online (Sandbox Code Playgroud)

DataModel.h

#import <Foundation/Foundation.h>

@interface DataModel : NSObject <UIAlertViewDelegate>
- (void)ShowMeAlert;
@end
Run Code Online (Sandbox Code Playgroud)

DataModel.m

#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
Run Code Online (Sandbox Code Playgroud)
  • 如果用于显示警报的代码及其委托方法是ViewController完美的.
  • 当我删除UIAlertDelegation方法...didDismissWithButtonIndex...- 没有委托的工作.
  • 当我设置UIAlertView delegatenil-作品不转交.

有什么线索有什么不对吗?

ser*_*gio 8

在这个方法中:

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

  [super viewDidLoad];
}
Run Code Online (Sandbox Code Playgroud)

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

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

  [super viewDidLoad];
}
Run Code Online (Sandbox Code Playgroud)