2014-09-19 5 views
0

나는 논리적 인 질문만을하고 있습니다. 풀을 먼저 풀어서 개체를 놓으면 개체가 메모리에서 해제됩니까? 개체를 풀면 개체가 속한 풀을 해제 한 후 어떤 일이 발생할 수 있습니까?

-(void)setImage 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    NSString *strUrl = @"--some URL--"; 

    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]]; 
    UIImage *myimage = [[UIImage alloc] initWithData:imageData]; 

    [pool release]; 
    [imageData release]; 
} 


[self performSelectorInBackground:@selector(setImage) withObject:nil]; 

는 코드가 아닌 ARC 환경에서 실행하는 것으로 가정합니다 : 예를 들어, 다음은 내 코드입니다.

답변

1

imageore 객체를 autorelease 풀에 추가하지 않았으므로 풀이 풀리지 않으므로 괜찮습니다. 이 같은 오토 릴리즈 풀에 imageData의 객체를 추가 한 경우 :

[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease]; 

여분의 출시는 overrelease 것 및 앱 충돌이 발생할 수 있습니다. myImage가 누출 된 적이 없어 보이는 것처럼 보입니다.

+0

내 코드 조각에 autorelease를 사용하면 어떻게 되나요? 왜냐하면 풀은 해제 메시지를 보내는 책임이 있기 때문입니다. 하지만, 내 경우에는 수영장 풀어 놓은 후에 개체를 놓습니다. 내가 틀린 것을 이해하면 나를 바로 잡아라. – NSPratik

+1

'imageore'에'autorelease'를 추가하면, 이미지를 생성 할 때 자동 회수 풀이'imageData'의 보유 수를 감소시키고 할당이 해제 될 때 보유 수는 1이됩니다. 그런 다음'imageData'를 시도하면 충돌이 발생합니다. 'myImage'에'autorelease'를 추가하면 잘 동작합니다. –

+0

그래, _ [imageData release] _가 실행되면 imageData 객체가 발견되지 않고 충돌이 발생합니다. – NSPratik

1

[pool release];으로 전화를 걸면 풀에 추가 된 autorelease 개체가 즉시 할당 해제되지 않습니다. 따라서 release을 명시 적으로 호출하면 imageData의 참조 횟수가 1 씩 줄어 듭니다. 풀이 풀리면 두 인스턴스 중 하나의 응용 프로그램이 취소되거나 인스턴스가 nil 객체로 보내지면서 충돌이 발생합니다.