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)
**
这个:
_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将被释放,如果您尝试使用它,它将崩溃.复制块时,副本将被堆分配,并将一直存在直到它被释放.
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |