Objective-C의 메모리 관리와 관련된 NSDate Init 질문
-
11-09-2019 - |
문제
나는있다 NSDate
생성 된 개체
NSDate *date = [[NSDate alloc] init];
나중에 날짜를 "Now"로 재설정하고 싶습니다.
[date init];
또는
date = [date init];
일을 할 수도 있지만 그렇지 않습니다. 대신에,
[date release];
date = [[NSDate alloc] init];
공장. 나는 이것에 대해 약간 혼란 스러워요. - (id) init
, 그것은 말한다 :
초기 날짜와 시간에 초기화 된 nsdate 객체를 반환합니다.
이후 date
이미 할당되었으므로 단지 필요하지 않아야합니다 init
메시지?
해결책
에 대해 생각하다 alloc
그리고 init
생성자의 논리적으로 분리 할 수없는 반쪽. 주어진 객체에서 "Init"로 시작하는 메소드 만 호출 할 수 있습니다. 객체가 초기화되면 다시 초기화하는 오류입니다. 이것은 nsdate뿐만 아니라 대상 C 객체에 해당됩니다. 그러나 NSDate 객체도 있습니다 불변 - 일단 만들어지면 변경할 수 없습니다.
후자의 코드가 작동하는 이유는 NSDate의 새로운 인스턴스를 만들기 때문입니다. 이것이 올바른 일입니다. [NSDATE 날짜]를 사용하여 동일한 일을 수행 할 수도 있습니다. 아직 (아직) 소유하지 않은 개체를 반환한다는 점에 유의하므로 보관 해야하는 경우 유지해야하며 나중에 해제해야합니다.
누군가로부터 물건을 받으면 이미 초기화되었습니다. (그렇지 않은 경우, 코드에서 제공 한 프로그래밍 오류이거나 규칙에 매우 드문 예외입니다.)
다른 팁
현재 날짜를 얻으려면 사용할 수 있습니다.
NSDate * now = [NSDate date];
당신이 그것을 유지하고 싶다면 retain
그것.
NSDate * now = [[NSDate date] retain];
당신은 재설정 할 수 없습니다 NSDate
init를 사용하면 init는 처음으로 객체를 초기화하기위한 것입니다.
다른 날짜를 얻을 수 있습니다.
NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];
그만큼 date
메시지가 반환됩니다 autoreleased
대신에 NSDate
, 따라서 release
또는 autorelease
.
그만큼 autorelease
객체를 정확히 해제 해야하는 위치에 대해 걱정하고 싶지 않은 경우에 사용됩니다. autorelease pool
. AutorElease Pool의 객체는 이벤트 루프 반복이 끝난 후 또는 풀에서 릴리스를 호출 할 때 릴리스됩니다 (메모리 관리에 대한 Apple Docs의 자세한 내용).
BTW. 그만큼 [NSDate date]
편의 방법 일 것입니다.
- (NSDate *)date
{
return [[[NSDate alloc] init] autorelease];
}