0

이 오류로 도와 주시겠습니까? ARC와 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 

**

답변

5

이 :

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

필요성이 될 : 블록 개체 수단 할당 스택 때문에

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

이다 그들이 범위를 벗어날 때 할당 해제됩니다. 따라서 viewDidLoad 메서드가 실행을 끝내면 _myOne에 저장된 블록의 할당이 해제되고 사용하려고하면 충돌이 발생합니다. 블록을 복사 할 때 복사본은 힙 할당이며 해제 될 때까지 살아남습니다.

+0

오. 고맙습니다. 순전히. ^^. 고맙습니다. 고맙습니다. – user1239633