2010-07-22 4 views
1

이것은 아마도 객체 alloc/retain/release에 대한 질문이지만 NSString을 예로 사용합니다. 나는 내가 할 수있는 것을 알고 있어요 :obj-c NSString 및 alloc/retain/release

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 

은 본질적으로 할당하고 나중에시 [mystring에 릴리스] 호출해야 내 변수 mystring에 의해 참조 문자열을 초기화 할 수 있습니다. 나는이 작업을 수행 한 후 그러나, 나는 다른 문자열 등으로 설정합니다

myString = someOtherString; 

내가 다른 객체에 내 포인터를 재 할당하고 원래의 모든 참조를 상실했기 때문에 기본적으로 메모리 누수를 만드는 것이 수행 할당 했어?

문자열을 개별적으로 할당하고 해제 한 다음 여러 번 값을 변경하려는 경우 '='이외의 다른 구문을 사용해야합니까, 아니면 해당 객체의 내용을 적절히 변경하기 위해 오버로드 된 것입니까? =를 사용할 때 원래 myString이 나타냅니다.

당신이 제대로 또 다른 포인터 값을 지정하기 전에 소유권을 포기하는 경우

답변

4

예, 예를 들어 메모리가 누출됩니다.

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
myString = someOtherString; 

당신이과 같이 수행해야합니다 :

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
[myString release]; 
myString = someOtherString; 

나는 전체를 들었 가장 좋은 방법은 설명/해제 일을 유지 당신이 누군가를위한 개를 산책하는 상상이다. 귀하의 "개체"는 개이며 "보유"는 개에 가죽 끈을 붙이고 "해제"는 가죽 끈을 벗습니다. 당신이 원하는대로 개에 많은 가죽 끈을 가질 수 있지만 개가 자유롭게 (누수가) 실행되지 않도록 개에 가죽 끈을 하나 이상 붙이고 싶으면 개에서 모든 가죽 끈을 꺼내고 싶다. 소유자에게 (당신은 객체를 제거하고 싶다). 당신의보기에서, 당신은 개 중류 도보에 가죽 끈을 놓고 다른 개의 가죽 끈을 집어 들게하는 것으로 생각할 수 있습니다.

+0

맞아요. 기억 누출은 단어가 다가 가면서 사람들의 개를 잃어 버리는 것처럼 주변에 마르는 사람들을 걷는 개와 비슷합니다. – jasongetsdown

+0

나는 당신의 유추가 조금 짧다고 생각합니다. 왜냐하면 "가죽 끈"이 참조 횟수와 같고 개가 고리에 붙어 있지 않은 가죽 끈을 가지고 있다면 개가 도망칩니다. 그러면 나의 예는 가죽 끈을 너무 많이 잡아 내지 않을 것이기 때문입니다 다른 개를 보면서 내 가죽 끈을 놓고 다른 개를 보려고하는 것. 더 정확한 비유와 같은 소리는 가죽 주전자에 연결하거나 가죽 끈을 연결하는 끈을 추가하는 것만큼 가죽 끈을 들고있는 소유자를 갖지 않는 것입니다.하지만 그 해명에 감사드립니다. :) – Joey

+0

Sheesh, 모두 비평가입니다 ... ACBurk의 설명은 훌륭했습니다 (프로그래머!) – pchap10k

1

, 아무 누출도 없다 :

NSString *a = [[NSString alloc] init]; 
// ... 
[a release]; // relinquish ownership 
a = someOtherString; // fine, we don't own the previous instance anymore 

당신이 release를 호출하여 객체의 소유권을 포기하는 순간, 당신은 효과적으로 해제 고려해야한다 - 이것은 수도 그것에 대한 마지막 언급이되었습니다. 포인터가 여전히 같은 값을 가지고 있다는 것은 Objective-C 클래스 유형을 구현하고 사용하는 방법의 부작용에 불과합니다.

메모리 제약에 따라 당신의 코드가 무엇을, 당신은 또한 autorelease D 인스턴스를 사용할 수 있습니다

NSString *a = [NSString stringWithString:@"moo"]; 
a = someOtherString; // fine, a will be released later by the nearest autorelease pool 

참고 참조가 지역 변수 그러나 바르가 아닌 경우, 당신은 아마 원하는거야로를 대신 declared properties을 사용하십시오.

0

는 다음을 수행 할 수 있습니다 : 당신이 그것을 해제 할 필요가 없습니다

NSString *myString = [NSString stringWithString:@"Test"]; 

반환 된 문자열 오토 릴리즈된다. 당신은 또한 그것을 소유하지 않습니다. 그게 문제라면 다른 사람들이 제안한대로 release 메시지를 myString으로 보내면 값을 다시 지정해야합니다.