我在 ARC 下创建了一个类,其中包含一些接受块的方法。问题是应用程序不断崩溃,我认为崩溃的原因是对象被 ARC 释放。我的问题是,我该如何解决这个问题,即如何保留对象的引用,以便在处理块之前不会释放对象。
这是 .h 类
#if NS_BLOCKS_AVAILABLE
typedef void (^KelaMagicalControlCompletionBlock)();
#endif
@interface KelaMagicalControl : NSObject
+(KelaMagicalControl *)controlWithTitle:(NSString *)title message:(NSString *)message;
-(id)initWithTitle:(NSString *)title message:(NSString *)message;
-(void)showWithTouchCompletionBlock:(KelaMagicalControlCompletionBlock)completionBlock;
@end
这是 .m 类
#import "KelaMagicalControl.h"
@interface KelaMagicalControl()
@property (nonatomic, strong) NSString * title;
@property (nonatomic, strong) NSString * message;
@property (copy) KelaMagicalControlCompletionBlock completionBlock;
@end
@implementation KelaMagicalControl
-(void)dealloc
{
NSLog(@"deallocated");
}
+ (KelaMagicalControl *)toastWithTitle:(NSString *)title message:(NSString *)message
{
KelaMagicalControl * magicalControl = [[KelaMagicalControl alloc] initWithTitle:title message:message];
return magicalControl;
}
-(id)initWithTitle:(NSString *)title message:(NSString *)message
{
if(self = [super init])
{
_title = title;
_message = message;
}
return self;
}
-(void)showWithTouchCompletionBlock:(void (^)())completionBlock
{
UIWindow * mainWindow = [[UIApplication sharedApplication]keyWindow];
UIView * viewTemp = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 100)];
[viewTemp setTag:10001];
[viewTemp setBackgroundColor:[UIColor redColor]];
[mainWindow addSubview:viewTemp];
UITapGestureRecognizer * tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mainViewTapped)];
[viewTemp addGestureRecognizer:tapGestureRecognizer];
self.completionBlock = completionBlock;
}
-(void)mainViewTapped
{
if(self.completionBlock)
{
self.completionBlock();
self.completionBlock = nil;
}
}
从控制器类,我向自定义类的方法发送消息,如下所示:
-(IBAction)showMagicalControl:(id)sender
{
NSString * title = @"Title";
NSString * message = @"This is a very long message";
KelaMagicalControl * magicalControl = [[KelaMagicalControl alloc] initWithTitle:title message:message];
[magicalControl showWithTouchCompletionBlock:^{
NSLog(@"control tapped");
}];
}
所以它显示控件很好,但是当我点击它时,它没有执行块,而是崩溃并出现错误“obj_msgsend”。它甚至没有达到 showMagicalControl 方法。我认为,当我使用 ARC 时,它会自动释放,我可以看到 dealloc 被立即调用(在执行块之前)。如果我创建 magicRecord 的属性并使用它,它不会崩溃,但根据我的要求,我不想使用全局 iVar 或属性来调用这个块代码。
请问有什么建议吗?