Блок с не ARC, проблема утечки памяти - PullRequest
0 голосов
/ 29 февраля 2012

Не могли бы вы помочь мне с этой ошибкой. Я пробовал этот код с 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

**

1 Ответ

5 голосов
/ 29 февраля 2012

Это:

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

должно быть следующим:

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

Это связано с тем, что блочные объекты размещены в стеке , что означает, что они освобождаются, когдаони выходят за рамки.Поэтому, когда метод viewDidLoad завершит выполнение, блок, содержащийся в _myOne, будет освобожден, и если вы попытаетесь его использовать, он потерпит крах.Когда вы копируете блок, копия выделяется кучей и будет действовать до тех пор, пока не будет выпущена.

...