2013-03-29 5 views
2

내가 지금은 아래의 코드가, 오토 릴리즈에 대한 질문이 있습니다 :autorelease와 runloop 및 thread의 관계는 무엇입니까?

int main(int argc, char *argv[]){ 
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
}} 

다큐먼트가 @autoreleasepool의 끝에서 말한다을 {} 오토 릴리즈로 표시된 개체가 해제 메시지를 받게됩니다. 하지만 UIApplicationMain은 절대 반환하지 않습니다. 즉, 흐름이 @autoreleasepool의 끝까지 도달하지 못하고 autorelease로 표시된 객체는 앱이 죽을 때까지 결코 해제되지 않습니다. autorelease의 의미가 없다 .....

iOS 시스템이 일부 스레드 (하나의 스레드와 하나의 runloop이 있음)를 생성 할 것이라고 말한 사람에게 runloop이 autorelease 풀을 생성한다고 말했습니다 .so autorelease 객체는 thead 또는 runloop의 끝에서 해제됩니다. 하지만 가장 큰 상황은 주 스레드를 사용하는 것입니다. 그래서 그가 말하는 것은 나를 설득하지 않습니다.

오토 레어를 사용하기에 적절한시기. 오랫동안 혼란 스러웠습니다.

나는 하나 runloop 끝 (주 runloop 모든 응용 프로그램의 생명을 ?? 존재하는 것) 할 때 오토 릴리즈 객체가 얻을 발표 할 예정 다른 점을 얻을 그래서 잘 모르겠어요 ..

어느 지점 및 관련 문서는 것입니다 감사하겠습니다!

+1

나는 같은 질문을했다. 수용 가능한 행동에 대한 의미/시연의 이유가있을 수 있습니다. UIApplicationMain의 유일한 방법은 프로그램이'exit() '하는 것이므로 어쨌든 모든 메모리가 운영 체제로 반환됩니다. – borrrden

+0

네, 맞습니다. – frank

답변

5

예, 기술적, UIApplicationMain는 반환하지 않습니다, 그래서 당신은 @autoreleasepool 블록은 어쩌면 가지가없이 오토 릴리즈 된 불평 이외의 차이 (도하지 않습니다 것이라는 점을 제거한 경우가이 경우에, 그래서 그 @autoreleasepool 블록의 끝을 명중하지 autorelease 풀). 그러나 main 함수는 항상 UIApplicationMain (iOS 응용 프로그램에는 없지만 일반적으로)을 호출하는 방식으로 작성된 것으로 상상할 수 있습니다. 그러면 차이가 생길 것입니다.

모든 스레드의 진입 점 본문에 항상 @autoreleasepool 블록을 두는 것이 좋으며, main은 주 스레드의 진입 점입니다. 그래서 일관성을 위해 항상 거기에 넣는 것이 좋습니다.

당신이 말한 사람은 UIApplicationMain 내부에는 실행 루프 (이벤트를 처리하는 무한 루프)가 있으며, 각 반복 내부에는 자동 복구 풀이 있습니다 (또는 반복 될 때마다 반복 될 것입니다. 구현 세부 사항). 이것은 main의 autorelease 풀과는 아무런 관련이 없습니다.

+0

감사합니다. 더 많은 문서를 읽어야한다고 생각합니다. – frank