2013-04-19 4 views
0

왜 다음 코드가 충돌합니까? 주석 처리 된 코드는 충돌하지 않습니다.Objective-C에서 보유 속성이 유지되지 않는 이유는 무엇입니까?

@property (retain) NSDate *lastCurrentDate; 

... 

@synthesize lastCurrentDate; 

- (void)viewWillAppear:(BOOL)animated { 
    BOOL crash = [lastCurrentDate isEqualToDate:[NSDate date]]); 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    //lastCurrentDate = [[NSDate date] retain]; 
    lastCurrentDate = [NSDate date]; 
} 

그렇다면 왜 소유권이 Objective-C에 유지되지 않을 수 있습니까?

+0

충돌 오류를 신고 할 수 있습니까? – LuckyStarr

+0

내 끝에서 똑같은 것을 시도했지만 충돌이 발생하지 않습니다. 여기에 표시된 코드에 누락 된 것이 있습니까? 누락 된 것이 있으면 업데이트 해 주시면 감사하겠습니다. 그렇지 않으면 충돌 오류로 더 잘 업데이트 할 수 있습니다. –

+0

아직 초기화되지 않았기 때문에 isEqualToDate 메시지를 보낼 때 변수가 null이기 때문에 충돌이 발생한다고 생각합니다. viewDidDisAppear 메서드에서 변수를 초기화하는 중 오류입니다. – LuckyStarr

답변

2

을 당신은 쓸 때 @synthesize lastCurrentDate - 당신은 또한 'lastCurrentState를'라는 이름의 변수를 생성, 당신은 당신에게 lastCurrentDate = [NSDate date];을 쓸 때 직접 이 변수에 액세스하십시오. 속성은 점을 통해 액세스해야합니다 : self.lastCurrentDate = ....;

마지막 xCodes에서는 합성을 할 필요가 없습니다. 자동으로 처리하지만 '_'접두어로 이름 지정된 변수가 만들어집니다. 다음과 같습니다. @synthesize variable = _variable;

1

대신 속성 접근 방법을 사용하는 인스턴스 변수에 직접 할당하기 때문에 :

self.lastCurrentDate = [NSDate date]; 
+0

왜 인스턴스 변수는 "_lastCurrentDate"대신 "lastCurrentDate"라는 이름을 갖고 있습니까? – Dmitry

+1

@Altaveron : 코드에'@synthesize lastCurrentDate; '가 있으므로 다른 답변을 참조하십시오. –

2

self.lastCurrentDate = [NSDate date]을 사용하십시오. self.lastCurrentDate을 사용하면 setter 메소드를 통해 할당하므로 retain 속성을 통해 vaiable을 선언하므로 setter 메서드는 assignretain의 두 작업을 수행합니다.