2012-09-11 4 views
1

나는, 우리는 ARC로 코드를 작성하는 것을에서 인스턴스화 viewDidUnload에서 nil 속성해야 감안할 때 : (여기 nilling 가끔 IDE에서 생성)의 viewDidLoad 및 ARC와 XIBs

  1. XIB를

  2. initialiser에서
  3. 와 약한

  4. 을 함께 IBOutlet하지 않은

?

답변

1

viewDidUnload의 목적은 앱에 메모리 경고 수신시보기가 제거 되었기 때문에 더 이상 존재하지 않는 사용자 인터페이스 개체에 대한 참조를 제거 할 수있는 기회를 제공하는 것입니다. 따라서 :

  1. (뷰가 언로드되고 있기 때문에) 당신은 nil 모든 사용자 인터페이스를 컨트롤을 설정해야합니다. weak 속성에는 불필요합니다 (일반적으로이 항목에서는 weak/Apple guidance). 그러나 Xcode가이 속성을 삽입하면 문제가되지 않습니다. viewDidUnload에서 수행 할 작업에 대한 지침은 Resource Programming Guide: The Nib Files의 "메모리 경고"절을 참조하십시오. 당신은 ARC (예를 들어, 사용하지 않을 경우 특히

  2. 그리고 당신은 viewDidLoad에서 설정 비 사용자 인터페이스 객체에 대한

    , 나는, 그냥 맹목적으로 viewDidUnloadnil에 그 설정에 대한 경계 거라고 만약 당신이 실수로 nil 인스턴스 변수, 당신은 누수가 발생할 수 있습니다). 그리고 복구 할 메모리의 양과 데이터를 다시 검색하는 "비용"(예 : 일부 원격 서버의 경우)의 균형을 원할 수도 있습니다. 그럼에도 불구하고 didReceiveMemoryWarning에 비 UI 객체에 대한 메모리 해제를 처리하는 것이 좋습니다. 내 마음에

, 나는 더 이상 존재하지 않는 수있는 사용자 인터페이스 객체에 대한 참조를 유지하고 있지 않다 있는지 확인하는 기회로 viewDidUnload을보고, 나는 캐시 또는 기타 UI 관련 항목을 비워 didReceiveMemoryWarning를 사용 일부 메모리를 안전하게 복구 할 수 있습니다. 또한 iOS 6이 염려되는 경우 viewDidUnload 처리가 변경 될 수 있으며 NDA가 공개적으로 논의 할 수 없지만 iOS 6 Beta 4 Release Notes을 참조하고 viewDidUnload에 대한 참조를 찾아 보시기 바랍니다.

+0

'weak' 변수를'nil'으로 설정하는 것이 좋습니다? '약한 '참고 문헌 뒤에있는 아이디어는 자동으로 여러분에게 불필요한 것이다.** 약한 참조를 수동으로 없애지 않아야합니다. 뷰가 다시 필요하면'viewDidUnload' 이후에'viewDidLoad'가 항상 호출되기 때문에 생성 된 비 UI 프로퍼티는 nil되지 않습니다. 더 많은 메모리를 확보하는 좋은 방법이 있습니다. 마지막으로, 그는 속성에 대해 이야기하고 있습니다. 'self.property = nil;'을 사용하면 절대 누출되지 않을 것입니다 (당신이 끔찍한 일을하지 않는 한). – Mazyod

+0

@Mazyod 다시 약하다, 맞습니다. 인터페이스 빌더를 통해 IBOutlet을 생성 할 때 Xcode가'viewDidUnload'에서 약한'IBOutlet' 속성을'nil'에 자동으로 추가한다는 것을 감안할 때 저는 이것이 좋은 습관으로 여겨 질 것이라고 추측했지만, 약한'IBOutlet' 속성에는 불필요하다는 것이 맞습니다. 아무런 해를 입지 않습니다 (예 : Xcode가 추가 한 코드 줄을 지우거나 삭제할 필요가 없음).하지만 불필요합니다. 그에 따라 내 대답을 수정했습니다. – Rob

+0

@Mazyod이 속성을'nil'으로 설정했다면, 누수는 없을 것입니다 : 동의합니다. 그러나 내 의견은 실수로 _property의 인스턴스 변수를'nil'으로 설정 한 경우에 관한 것입니다. (그리고 새로운 프로그래머는 그 속성의 인스턴스 변수로 속성 참조를 고정시킵니다.) 더 큰 요점은 그것이 속성이기 때문에 blithelyly 'nil-ing하지 않아야한다는 것입니다. UI 속성 일뿐입니다. 비 UI 속성 (a)은 대소 문자로 처리해야합니다. 그리고 (b) 아마도 viewDidUnload'에 관계없이해서는 안됩니다. – Rob

1

귀하의 일반 규칙 :

  1. nil 모든 strong IBOutlets 만. weak 사람을 그대로 둡니다.
  2. nil 모든 속성은 viewDidLoad에서 인스턴스화하고 하지init, initWithCoder:initWithNibName:bundle:.

당신은 "즉석에서"다시 또는 nil 체크가되어도 nil 속성은 더 많은 메모리를 확보해야한다.