2011-01-24 2 views
2

다음은 수동 릴리즈가 필요 없음을 알았습니다. (자동 릴리즈 됨) :iOS 메모리 관리 : 끈을 풀어 주겠다고?

NSString* str1 = [NSString string]; 

그리고 수동 릴리즈가 필요할 것입니다 :

NSString* str2 = [[NSString alloc] init]; 
[string2 release]; 

그러나 이것에 대해서요? 그것은 autoreleased 또는 아닙니다?

NSString* str3 = @"Example string"; 

마지막으로, 아래 스 니펫을 살펴 보겠습니다. iOS 메모리 관리를 올바르게 이해했다면 RootViewController 참조 'rvc'를 해제하면 코드를 사용할 수 없도록 객체를 지울 수 있습니다. - 나는 그것을 원하지 않을 것입니다. 하지만 적어도 null에 대한 참조를 설정해야합니까? 아니면 장기간에 메모리 누수를 일으키지 않고 코드에 thease 참조를 남길 수 있습니까?

- (void)myMethod 
{ 
RootViewController *rvc = (RootViewController *)navigationController.topViewController; 
// using rvc somehow... 
// ...but should I set it to null? 
} 

답변

6

문자열 리터럴을 릴리스 할 필요가 없습니다. 자동 리 릴리스되지 않지만 해당 행에도 생성되지 않습니다. 문자열 리터럴은 특별한 경우 (Objective-C의 유일한 종류의 리터럴 객체 임)이며이를 해제하려는 시도는 무시됩니다.

rvc는 로컬 변수이므로 MyMethod가 끝나면 곧바로 액세스 할 수 없게됩니다. 아무것도 설정할 필요가 없습니다 (null이 아닌 null이 될 수 있습니다). 할당은 topViewController의 주소를 얻고 로컬 변수에 저장하는 것을 제외하고는 아무 것도하지 않습니다. 따라서 메모리 관리 효과는 없습니다.

1

@"Example string"은 컴파일 타임 상수입니다. 메모리는 컴파일러에 의해 할당됩니다. 그래서 라인에

NSString *str3 = @"Example string"; 

그냥 상수에 할당하고 당신이 단어를 "ALLOC"을 "유지"중 하나를 사용하는 경우 str3

5

를 공개해서는 안, "새", "복사" (RANC) 그러면 객체의 소유자이며 메모리 관리를 담당하게됩니다. RANC 단어 중 하나를 사용하지 않았으므로 릴리스 할 필요가 없습니다. 이에 대한 자세한 설명은 http://www.mobiledev.nl/memory-management-in-ios/을 참조하십시오.