2011년 7월 1일 금요일

Xcode4 tip -- NSZombiEnabled

Product -> Edit Scheme ->
Run Debug에서 Arguments 탭을 선택
Environment Variables에
NSZombieEnabled 를 추가하고 Value에 YES 를 넣어준다.

객체 release를 했을때 release를 하지 않고 다시 참조 하려고 하는 코드를
디버그 창에 출력 해준다.


앱이 비정상 종료를 할때 NSZombie를 사용했더니 다음과 같은 메세지가 출력됬다.


*** -[UIImage isKindOfClass:]: message sent to deallocated instance

구글링을 하니..



Sounds like you're over-releasing your image objects. Like all the Cocoa collection classes, an NSMutableArray instance retains objects added to it and releases them when it is itself released. If you create an object using a call that doesn't increase its retain count and then release it once you've added it to the array, you'll see this sort of error.
For example:
UIImage *image = [UIImage imageWithData:someData];
[myArray addObject:image];
[image release]; // <-- BAD!
Here you don't own the object image (because you didn't create it using alloc or copy), so you don't need to release it. The pointer in the array now points to an object with a retain count of zero, which will eventually be deallocated.
Using autorelease instead of release in the above example is equally wrong, for the same reason.

답은 imageWithData:someData처럼 머 UIImage가 alloc한게 아니기 때문에 release나 autorelease모두 문제가 된다는 것이다.
덕분에 잘 해결 했다.

댓글 1개:

익명 :

hi 나 성하~
구글링하다가 여기까지 왔네~ ㅎ
요즘 아이폰해? 후후후