0

このエラーで私を助けてください。 私はARCと非ARCでこのコードを試しました。 ARC付きの はOKです。非ARCの場合 どうすればいいですか。お願い助けて。^__ ^;ARC以外のブロック、メモリリークの問題

ボタンを押すと、エラーが発生します。 **

#import <UIKit/UIKit.h> 
@interface FirstViewController : UIViewController { 

    void     (^_myOne)(void);  
    UIView*     _viewOne; 
} 
@property (nonatomic, retain) void   (^myOne)(void); 
@property (nonatomic, retain) UIView*   viewOne; 
- (void)useFirstOne:(void(^)(void))blockOne; 
@end 
#import "FirstViewController.h" 
@implementation FirstViewController 
@synthesize myOne = _myOne, viewOne = _viewOne; 
- (void)useFirstOne:(void (^)(void))blockOne { 

    blockOne(); 
} 
- (void)buttonPressed { 
     [self useFirstOne:self.myOne]; //If I put this line into 'viewDidLoad', has no problem. 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor redColor]; 
    UIButton* buttonA = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    buttonA.frame = CGRectMake(0, 0, 100, 44); 
    buttonA.center = CGPointMake(160, 350); 
    [buttonA setTitle:@"Button" forState:UIControlStateNormal]; 
    [buttonA addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:buttonA]; 
    _viewOne = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    [self.view addSubview:self.viewOne]; 

    _myOne = ^{ 
     self.viewOne.backgroundColor = [UIColor grayColor]; 
    }; 
} 
@end 

**

答えて

5

これ:

_myOne = ^{ 
    self.viewOne.backgroundColor = [UIColor grayColor]; 
}; 

ニーズこのすべき:ブロックオブジェクトはを割り当てスタック手段であるため

_myOne = Block_copy(^{ 
    self.viewOne.backgroundColor = [UIColor grayColor]; 
}); 

これは彼らが範囲外に出たときに割り当て解除されるということです。したがって、viewDidLoadメソッドの実行が終了すると、_myOneに保持されているブロックは割り当てが解除され、使用しようとするとクラッシュします。ブロックをコピーすると、コピーはヒープ割り当てとなり、解放されるまで生き残ります。

+0

ああ。ありがとうございました。そんなに。 ^^。ありがとうございました。ありがとうございました。 – user1239633