2010-12-10 5 views
0

나는이 코드에서 왜 내가 ws_data 변수를 사용하여 self.ws_data를 사용하여 값을 할당하고 ws_data 만 사용한다면 메모리 누수가 발생하는지 이해할 필요가있다.왜 "self"로 설정하면 메모리 누수가 발생합니까?

self.ws_data는 dealloc에서 발표 된 @property (copy) NSString *입니다.

dispatch_queue_t ws_queue = dispatch_queue_create("ws check win", NULL); 
dispatch_async(ws_queue, ^{ 
    self.ws_data = [[NSString alloc]initWithContentsOfURL:url]; 
}); 
dispatch_release(ws_queue); 

고맙습니다!

답변

2

self.variableName은 접근자를 통해 변수에 액세스합니다. ws_data NSString은 속성 선언에 복사본으로 설정되었으므로 해당 선언을 통해 설정하면 문자열이 유지됩니다.

자아를 사용하지 않음.은 그 접근자를 거치지 않고 ivar를 참조합니다. 또한 변수가 복사되지 않으므로 메소드 참조가 사라질 때 변수가 사라집니다 (메서드가 끝났을 때처럼).

확률을 원하십니까? 완료되면 dealloc에서와 마찬가지로 방금 릴리스해야합니다.

이 액세스를 두 번째 보유로 설정하면 다른 곳에 보관할 수 있습니까?

+0

아니요, 어디에도 보유하지 않습니다. – MatterGoal

1

이 경우에는 올바르게 속성을 이해하고 (매우 오랫동안 iOS 개발을 수행하지 않았기 때문에) 그렇지 않습니다. 속성에서 복사 속성을 사용하는 경우, 당신이 self.ws_data를 사용할 때 실제로는 이미 할당 된 NSString에 copy 메소드를 호출하고 있습니다.이 메소드는 보유 수를 1로하여 NSString의 개별 인스턴스를 작성합니다.

그러나 원래 NSString (위의 샘플에 할당 됨)은 어느 시점에서 릴리스되지 않으므로 누수가 발생합니다.

당신은 사용할 수 ...

self.ws_data = [[[NSString alloc]initWithContentsOfURL:url] autorelease]; 

은 ... 대신에, 내가 생각했을 것입니다.

관련 문제