ブロックを受け入れるいくつかのメソッドを使用して、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 またはプロパティを使用したくありません。
何か提案はありますか?