阻止非ARC,内存泄漏问题

use*_*633 0 memory-leaks objective-c ios objective-c-blocks automatic-ref-counting

你能帮我解决这个错误吗?我用ARC和非ARC试过这段代码.用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
Run Code Online (Sandbox Code Playgroud)

**

Tom*_*ing 5

这个:

_myOne = ^{
    self.viewOne.backgroundColor = [UIColor grayColor];
};
Run Code Online (Sandbox Code Playgroud)

需要是这样的:

_myOne = Block_copy(^{
    self.viewOne.backgroundColor = [UIColor grayColor];
});
Run Code Online (Sandbox Code Playgroud)

这是因为块对象是堆栈分配的,这意味着它们在超出范围时会被释放.因此,当viewDidLoad方法完成执行时,保留的块_myOne将被释放,如果您尝试使用它,它将崩溃.复制块时,副本将被堆分配,并将一直存在直到它被释放.