2009-10-08 9 views
1

내가 가진 새로운 인스턴스를 해제에 NSDateComponents 충돌 :코코아 터치 :

NSDate *d = [[NSDate alloc] init]; 
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
NSDateComponents *dc = [calendar components:unitFlags fromDate:d]; 
// doing something with dc.day, dc.month, dc.year 
[dc release]; 
[d release]; 

난 그냥 GET을했고 릴리스는 "뭔가를하고 .. 일부"를 제거하려고했습니다, 그리고 그것은 여전히 ​​충돌합니다. [dc 릴리스] 부분 만 주석 처리하면 모두 정상적으로 작동합니다.

Obj-C를 처음 사용했습니다. 왜이 충돌이 일어나는 지 아십니까? 내가 잘못하고 있니?

답변

4

dc을 출시하지 않아야합니다. alloc, new 또는 copy에서 온 것이 아닙니다.

브러쉬 업 Cocoa Memory Management Rules

+0

맞아요, 페이지에 표시됩니다. 하지만 (캘린더에 의해 생성 된) 새 객체에 대한 포인터를 얻었습니다. 캘린더는 더 이상 아무 것도하지 않습니다. 따라서 캘린더는 언제 릴리스할지 알 수 없습니다. 언제 출시됩니까? – Prody

+1

캘린더에서 반환 한 인스턴스가 자동으로 리 릴리스됩니다. 이것은 다음 자동 릴리스 풀 릴리스/유출 시간 (종종 이벤트 루프의 끝)에서 해제됩니다. 이 메서드의 범위를 벗어나면이 메서드를 참조해야합니다. – nall

+0

나도 네가 옳은 것 같아.하지만 성능상의 이유로 아이폰에는 오토 릴리즈 (autorelease) 기능이 없다고 읽었다. 나는 그것에 대해 읽어야 할 것이다. 고마워,이 날 도왔습니다 :) – Prody