문맥에 대한 블록 함수와 값을 테스트하고 싶습니다. 테스트 코드는 다음블록 함수 및 메모리 문제가있는 개체 -c
//xxx.h
@interface textObj : NSObject
@property (nonatomic, retain) NSNumber * num;
@end
typedef void (^ returnHandle)(NSNumber * res);
@interface BlockTest : NSObject
- (void) textBlock:(textObj *)num completionHandler:(void (^)(NSNumber * res))handler;
@end
//xxx.m
@implementation textObj
@synthesize num;
@end
@interface BlockTest(){
returnHandle rt;
}
- (void)toggleChromeDisplay;
@end
@implementation BlockTest
- (void) dealloc{
Block_release(rt);
[super dealloc];
}
- (void)toggleChromeDisplay
{
NSNumber *ret = [NSNumber numberWithInt:111];
rt(ret);
}
void (^handle)(NSNumber * res, NSError *error);
- (void) textBlock:(textObj *)g1 completionHandler:(void (^)(NSNumber * res))handler
{
rt = Block_copy(handler);
[self performSelector:@selector(toggleChromeDisplay) withObject:nil afterDelay:0.5];
return;
}
@end
시험 샘플 호출 코드 : 블록의
//first sample code...
- (void)viewDidLoad
{
[super viewDidLoad];
test = [[BlockTest alloc]init];
textObj * g1;
g1 = [[textObj alloc] init];
[g1 setNum:[NSNumber numberWithInt:10]];
NSLog(@"main 0 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
[test textBlock:g1 completionHandler:^(NSNumber *res) {
NSLog(@"value=%@", [g1 num]);
[g1 setNum:[NSNumber numberWithInt:20]];
NSLog(@"main 1 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
} ];
NSLog(@"main 2 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
[g1 release];
NSLog(@"main 3 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
}
함수, 나는 g1 값을 변경할 수 있습니다. 괜찮아. 그러나 g1을 테스트의 공개 값으로 선언하면 블록 함수에서 오류가 발생합니다. g1은 액세스 할 수 없습니다. EXC_BAD_ACCESS (코드 = 2, 주소 = 0x26) 오류을 출력합니다. 나는 두 개의 서로 다른 sampe 코드를 혼동입니다
//second sample code...
@interface UIMainViewController(){
@public
textObj * g1;
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
test = [[BlockTest alloc]init];
//textObj * g1;
g1 = [[textObj alloc] init];
[g1 setNum:[NSNumber numberWithInt:10]];
NSLog(@"main 0 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
[test textBlock:g1 completionHandler:^(NSNumber *res) {
NSLog(@"value=%@", [g1 num]);
[g1 setNum:[NSNumber numberWithInt:20]];
NSLog(@"main 1 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
} ];
NSLog(@"main 2 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
[g1 release];
NSLog(@"main 3 g1 num=%@ count=%d", [g1 num], [g1 retainCount]);
}
, 왜 두 번째 테스트 코드는 충돌을 충족?
"오류가 발생합니다"- 오류는 무엇입니까? –
은 g1 값에 액세스 할 수 없습니다. EXC_BAD_ACCESS 오류가 출력됩니다. – Golden
물론 그렇습니다 ...'[g1 release]'후에, g1이 할당 해제되므로 2 차 NSLog가 실제로 그 일을 많이 할 수는 없습니다 ... –