문제

나는있다 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];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top