2017-03-22 9 views
1

iOS의 모든 개체가 자동 해제 풀에 자동으로 추가됩니까? 아니요, 어느 쪽을 추가 할 것입니까 & 어느 쪽이 좋습니까?iOS의 모든 개체가 자동 해제 풀에 자동으로 추가됩니까?

예 : 그것은 그 이름 'copy/mutableCopy/alloc/new' 등의 방법에 의해 만들어지기 때문에

{ 
    NSString *str = [[NSString alloc] init]; 
    NSString *str2 = [NSString string]; 
} 

+ (NSString *)string { 
    return [[NSString alloc] init]; 
} 

str2 풀 autorelease를 첨가한다. 그래서 자기에 의해서 창조되지 않습니다. 그러나 나는 str가 추가 될지 여부와 그 이유를 모른다.

+0

왜 알고 싶습니까? – RunLoop

답변

-1

대답은 아니오입니다. 사실, 어떤 자동 릴리스 풀은 메소드 "문자열"의 obj입니다. 이처럼

// ARC 
{ 
    NSString __strong *str = [[NSString alloc] init]; // STEP A 
    NSString __strong *str2 = [NSString string]; // STEP B 
}// STEP Finish 


+ (NSString *)string { 
    id obj = [[NSString alloc] init]; 
    return obj; 
} 

객체는 객체해야 .Because 수정 (기본값) __strong있다, 당신에게 understand.In ARC 도움이 여기에 강한 포인터 포인트가, 나 죽을 수 있습니다.

STEP : str은 NSString 개체를 만들고 강력한 포인터를 만듭니다. STEP B : str2는 생성이 안되지만 메소드 문자열에서 NSString에 의해 생성 된 obj.obj 인 객체를 가리키고 있습니다. return이 필요하므로 자동 해제 풀에 추가됩니다. 그리고 obj에 str2 강력한 포인트, 그래서 obj 자동 릴리스 풀에 의해 릴리스 수 없습니다, 거기에 여전히 강력한 포인터를 가리 킵니다.

단계 완료, str, str2 메소드 밖, 더 이상 포인터가 없으므로 릴리스되었습니다. 단계 B에서 자동 해제 풀이 필요한 이유는 무엇입니까? obj를 자동 릴리즈 풀에 넣지 않으면 STEP Finish와 같이 str과 마찬가지로 컴파일러에 의해 해제 될 것이기 때문입니다.

"iOS 및 OS X 용 프로 멀티 스레드 및 메모리 관리"에서 모든 것.

내 가난한 영어는 잊어 버리십시오.

0

ARC는 autorelease 풀에 추가되는 개체와 어떤 개체가 아닌지에 대해 보장하지 않습니다. 예제의 객체 중도 ARC의 autorelease 풀에 추가되지 않았을 가능성이 큽니다.