iphone - 포함 - 앱스토어 심사 주말




iPhone 어플리케이션에서 autorelease가 특히 위험하거나 비싼 이유는 무엇입니까? (4)

iPhone 용 소프트웨어를 작성할 때 autorelease 사용하는 것이 위험하거나 지나치게 비싸다는 주장을 뒷받침하는 기본 소스 (또는 좋은 설명)를 찾고 있습니다.

몇몇 개발자들은이 주장을하고, 애플이 그것을 추천하지 않는다고 들었지만, 구체적인 소스를 뒷받침하지 못했습니다.

참고 문헌 :
autorelease-iphone
왜 이것이 메모리 누출 (iPhone)을 생성합니까?

참고 : 개념적 관점에서 볼 때, 자동 release 는 간단한 release 호출보다 약간 더 비싸다는 것을 알 수 있지만, 작은 벌금으로 Apple이이를 권장하기에 충분하다고는 생각하지 않습니다.

진짜 이야기가 뭐니?


(자신의 답변을 수락 할 수 없습니까?)

글쎄, 그 후, 나는 애플 개발자로부터 참조를 찾을 수 있었다, 페이지의 하단 근처에 사이드 노트로 추가 :

iPhone OS 참고 : iPhone OS에서는 응용 프로그램이 메모리가 제한된 환경에서 실행되기 때문에 응용 프로그램에서 많은 객체를 만드는 메서드 나 블록 (예 : 루프)에서는 자동 실행 풀을 사용하지 않는 것이 좋습니다. 대신 가능할 때마다 명시 적으로 객체를 릴리스해야합니다.

그래도 autorelease를 신중하게 사용하는 것이 좋습니다.

(그리고 지금 내 코멘트를 위해)

풀을 유지하는 데 일정량의 오버 헤드가있는 것 같습니다. 나는 내가 일관성있게 일을 선호하기 때문에 가능한 한 많이 autorelease를 피하도록 이 기사 를 읽었다. autorelease 및 일부 메모리가 완전히 수동으로 관리되는 다른 메모리가있는 경우 조금 더 혼란 스러울 수 있습니다.


autorelease를 사용하거나 사용하지 않는 것은 문제가되지 않습니다. 어떤 경우에는 자동 릴리즈가 유일한 방법이기 때문입니다. 문제는 " retain and release를 사용하는 대신 모든 객체에 대해 autorelease를 사용하지 않을까요? "입니다.

그 대답을 위해, 먼저 autorelease에 대한 적절한 사용법을 알아야합니다. firstName과 lastName의 두 가지 속성을 가진 클래스가 있다고 가정 해 보겠습니다. 각기 getter와 setter가 있습니다. 그러나이 두 문자열을 새로운 문자열로 연결하여 fullName을 반환하는 메서드가 필요합니다.

- (NSString *) fullName {
   NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
   // this is not good until we put [str autorelease];
   return str;
}

그 그림에 뭐가 잘못된거야? 반환 된 문자열에 대한 참조 횟수는 1이므로 누출을 원하지 않으면 호출자는 완료 될 때이를 해제해야합니다. 호출자의 관점에서 그는 방금 fullName 속성 값을 요청했습니다. 그는 그가 사용 후, 그리고 클래스에 의해 내부적으로 개최되는 NSString에 대한 일부 참조가 출시해야한다 브랜드의 새로운 개체를 가지고 있다는 사실을 모르고있다!

반환하기 전에 [str release] 를 놓으면 문자열이 삭제되고 메서드가 가비지를 반환합니다! 그것은 우리가 [str autorelease] release [str autorelease] 사용하여 나중에 (일반적으로 이벤트 처리가 완료 될 때) 객체를 릴리스하도록 표시하는 곳입니다. 그렇게하면 호출자는 객체를 가져오고 해제할지 여부를 걱정할 필요가 없습니다.

관례는 메서드가 호출자에게 반환하기 전에 새 객체에 대해 autorelease를 호출하는 것입니다. 예외는 이름이 alloc , new 또는 copy 시작하는 메소드입니다. 이 경우 호출자는 새로운 객체가 만들어 졌음을 알고 객체에 릴리스를 호출해야합니다.

객체를 쌓아서 메모리를 매우 빠르게, 특히 루프에서 막히기 때문에 릴리스를 자동으로 풀어 놓는 것은 나쁜 생각입니다. iPhone의 리소스는 제한되어 있으므로 메모리 사용을 최소화하기 위해 작업을 완료하자마자 객체를 릴리스해야합니다.


나는 내가 할 수있는 아이폰에서 autorelease를 사용하지 않는 경향이있다. (Jon이 지적했듯이, 당신은 항상 그것 없이는 할 수 없다.) 내가 작업하고있는 객체가 출시되지 않은 것을 알기를 원하기 때문이다. 그것들이 필요하다. 메모리 제약 조건은 기기에서 직면하게 될 가장 큰 문제 중 하나이며, 내가 알게 될 대부분의 충돌 문제의 근원이라고 생각합니다.

Apple에 의해 강조된 바와 같이, autorelease 풀 내에 겹치기 때문에 어떤 종류의 루프 내에서 autoreleased 오브젝트를 사용할 때 특별한 걱정거리가 있습니다. 그런 다음 풀을 배수 시키거나 풀을 만들거나 풀 때를 관리해야합니다. 루프를 통과 할 때마다 성능이 저하 될 수 있지만 너무 많은 패스를 사용하지 않으면 위험한 메모리 사용이 발생할 수 있습니다. Protein Data Bank에서 큰 (> 2 MB) 텍스트 파일을 가져올 때 간헐적 인 메모리 문제가 있기 때문에 분자에서 여전히 이것을 조정하고 있습니다. autoreleased 오브젝트를 최소화하여 성능을 향상시킬 수 있었지만 완전히 제거 할 수는 없었습니다.

조심해야 할 또 다른 영역은 스레드가있는 자동 릴리즈 된 객체를 사용하는 것입니다. 풀이 임의의 시간에 소모 될 수 있기 때문에 가능하면 자동 스레드 된 객체를 백그라운드 스레드에서 수행 할 때 사용하지 마십시오. 이로 인해 추적이 정말 재미있는 간헐적 인 충돌이 발생합니다.


나는 전염병처럼 autorelease 피하는 것이 좋습니다 것이 좋습니다. 메모리 관리 버그는 엄청난 시간과 돈을 낭비하는 가장 좋은 방법입니다. 이전 Mac 응용 프로그램에서 여러 번 과정을 거쳐야한다는 모호한 영광을 가졌습니다. 아이폰에는 메모리 제약이 있습니다. 매우 조심해야합니다. 아니면 앱이 불안정 해지고 충돌이 자주 발생합니다. 지난 여름에 출시 된 첫 번째 앱이 너무 많습니다.

안정적인 iPhone 응용 프로그램을 작성하는 유일한 방법은 모든 메모리를 직접 관리하고 일관되게 수행하는 것입니다. 프로젝트에서 유일하게 프로그래머 일지라도 나중에 감사 할 것입니다. "모든 것을 관리해줍니다"라는 언어로 프로그램하는 것을 배운다면 어려울 수 있습니다. 그러나 당신이 양질의 아이폰 앱을 만드는 것에 대해 진지하게 생각하는 경우 실제로하는 법을 배울 가치가 있습니다.







autorelease