我已經在ARC下創建了一個類,其中有一些方法接受塊。問題是應用程序不斷崩潰,我認爲崩潰的原因是對象正在由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立即被調用(在執行block之前)。它不會崩潰,如果我創建一個magicalRecord的屬性並使用它,但根據我的要求,我不想使用全局iVar或屬性只是調用此代碼塊。
有什麼建議嗎?
謝謝。這有助於很多,並按預期工作:)。我希望我能投票,但我沒有足夠的聲譽。我感謝您的幫助。 – Kela 2013-05-05 19:06:00