2

예 :보기 컨트롤러가있어서 없애 버립니다. 그러나 여전히 메모리 주소를 가지고있는 변수가 있습니다. 액세스하면 EXEC_BAD_ACCESS가됩니다. 당연하지. 그러나 : 변수가 유효한지 확인할 수있는 방법이 있습니까? 즉, 여전히 메모리에있는 내용을 가리키는 경우?인스턴스가 여전히 메모리에 있는지 확인하는 방법은 무엇입니까?

+0

, 즉 명확하게하시기 바랍니다. 앱에서 실제로 일어날 일을 요구하는 경우 다른 사람들이 말했듯이 이것은 잘못된 접근 방식입니다. – Ken

답변

18

를 수행

Cocoa Memory Management Guidelines

간단히 말해서, 당신이 뭔가를 주변에 붙들고 싶다면 retain이되어야합니다.

은 당신이 뭔가 멀리 가고 싶은 경우에 당신이 이전에 그것을를 유지 한 당신 release 또는 autorelease 그것을해야합니다.

당신 해야 결코 (당신의 dealloc 방법 중 하나가 끝날 때마다 [super dealloc]; 제외) 직접 전화 dealloc.

당신 해야 결코release 또는 autorelease 당신이하지 retain 않았다 객체.

일부 방법은 을 수행합니다.은 보유해야하는 객체를 반환합니다. release이어야합니다. alloc 클래스의 인스턴스 인 경우 retain을 의미합니다. copy 및 인스턴스 인 경우 복사본이 유지됩니다.

retainCount 방법을 사용하려는 경우에는 사용하지 마십시오. 유용하지 않습니다. 카운트를 델타로 유지하는 것만 고려하십시오. 추가하면 빼기를해야하지만 절대 값은 무시해야하는 구현 세부 사항입니다.

(즉, 결정적으로 객체의 유효성을 확인하는 방법이있다하더라도 -이 없습니다 -. 그것은 잘못된 해답이 될 것이다)

아, 그리고 빌드를 사용하여 분석을 Xcode의 기능. 그것은 다른 것들 사이에서 메모리 관리 문제를 식별하는 아주 좋은 - 그러나 완벽하지는 않은 - 일을합니다.

+0

+1 아멘, 목사. 이것이 메모리 관리의 복음입니다. –

2

전체 메모리 관리 모델에 대한 설정 무슨 그게 - 당신이 바로 그 시간에 적절한 시간에 retainreleaseautorelease를 호출하는 경우, 그런 일이 없습니다. NSZombie을 사용하면 디버깅에 도움이됩니다. 변수에 의한 경우

+0

그래, 당신 이이 사건을 확인하지 않아도됩니다, 당신은 그들을 필요로 할 때 개체가 유지되었는지 확인하고하지 않을 때 해제해야합니다. – Bearddo

0

, 당신은 당신의 객체에 대한 포인터가 여전히 다음 유효한 메모리를 참조하는지 여부 의미 :

MyClass에 * 인 myVariable = [[MyClass에 ALLOC]을 초기화] 물건의

// 톤은 ... 발생

경우 (인 myVariable = 0!) // 당신은 다시 읽을 필요 더 많은 물건

1

"NSZombieEnabled"중단 점을 사용하십시오.

이러한 이유로 모든 접근자를 사용하는 것이 좋습니다.개체가 어느 곳에서나 릴리스되면 nil에 할당되며 Nil 개체에서 API 또는 메서드를 호출하면 아무런 해가 없습니다. 그러므로 액세서리를 사용하는 습관을 가지십시오.

이 NSZombieEnabled 플래그를 빌드 설정에서 응용 프로그램의 인수로 추가하기 만하면됩니다. 그것을 가능하게하십시오. 이제 응용 프로그램을 디버그 모드로 실행합니다. 그런 충돌이 발생하면,이 중단 점은 어느 객체가 해제되었는지 그리고 어디에서 충돌하고 있는지를 보여줍니다. 당신이 이유를 디버깅 순수하게 요구하는 경우

건배, Manjunath

관련 문제