gpt4 book ai didi

objective-c - 单独类中的 UIAlertViewDelegate 会使应用程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 06:25:14 27 4
gpt4 key购买 nike

我在 ViewController 以外的类中遇到了 UIAlertView 委托(delegate)的问题。一切正常,直到用户单击 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
  • 如果用于显示警报的代码及其委托(delegate)方法在 ViewController 中 - 工作完美。
  • 当我删除 UIAlertDelegation 方法时 ...didDismissWithButtonIndex... -无需授权即可工作。
  • 当我将 UIAlertView delegate 设置为 nil -无需授权即可工作。

有什么问题的线索吗?

最佳答案

在这个方法中:

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

[super viewDidLoad];
}

您正在分配一个 DataModel 局部变量,该变量将在作用域结束时由 ARC 释放。因此,当 dismiss 被执行时,你的委托(delegate)就不再存在了。解决此问题的方法是将 DataModel 存储在 View Controller 的 strong 属性中。这样它就不会被释放。你会做的:

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

[super viewDidLoad];
}

关于objective-c - 单独类中的 UIAlertViewDelegate 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com