3

UIAlertView以外のクラスでの委任に問題がありViewControllerます。ユーザーがボタンをクリックするまではすべて問題ありませOKん-その後、アプリがクラッシュします

Thread 1: EXC_BAD_ACCESS (code=2, address 0x8)

ViewController.h:

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

@interface ViewController : UIViewController
@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()
@end

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

    [super viewDidLoad];
}
@end

DataModel.h

#import <Foundation/Foundation.h>

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

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
  • アラートを表示するコードとその委任方法が含まれている場合、ViewController完全に機能します。
  • UIAlertDelegationメソッドを削除すると、...didDismissWithButtonIndex...委任なしで機能します。
  • -に設定UIAlertView delegateするとnil、委任なしで動作します。

何が問題なのか手がかりはありますか?

4

1 に答える 1

8

この方法では:

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

  [super viewDidLoad];
}

スコープの最後で ARC によって割り当て解除される DataModel ローカル変数を割り当てています。したがって、dismiss が実行されると、デリゲートはもう存在しません。これを修正するには、View ControllerDataModelのプロパティに保存します。strongこの方法では、割り当てが解除されません。あなたがすること:

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

  [super viewDidLoad];
}
于 2012-10-10T10:23:57.060 に答える