我以为我做了一些聪明的事情,但是效果不佳。计划要有一个自定义的AlertViewDelegate对象,该对象通过一个块实现clickedButton方法。

#import <Foundation/Foundation.h>

@interface AlertViewDelegate : NSObject <UIAlertViewDelegate>

@property (nonatomic,copy) void(^completionBlock)(NSInteger clickedIndex, UIAlertView *alertView);

@end


#import "AlertViewDelegate.h"

@implementation AlertViewDelegate
@synthesize completionBlock;

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    completionBlock(buttonIndex,alertView);
}

@end


然后,在另一个类中:

  AlertViewDelegate * del = [[AlertViewDelegate alloc] init];
    [del setCompletionBlock:^(NSInteger buttonIndex, UIAlertView *alertView) {
        NSLog(@"%d",buttonIndex);
    }];

    UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"asdg" message:@"asdg" delegate:del cancelButtonTitle:nil otherButtonTitles:@"YES",@"NO", nil];
    [view show];


单击按钮时出现EXC_BAD_ACCESS错误。我的猜测是委托被释放了,因为我在一个方法(即它不是属性)中定义了它-这是一个合理的结论吗?关于如何解决该问题的任何建议,而不必在我使用的每个类中都声明一个alertviewdelegate属性?

最佳答案

是的-这是一个合理的结论。问题在于,委托离开后就立即被ARC释放,因为它仅在局部变量中被强引用。为此,您需要保留对委托对象的强引用,因为UIAlertView仅保留对委托的弱引用。

10-05 20:22