2012-06-28 3 views
5

:목표 - C 특성은 다음과 기술적으로 잘못된 무엇 게터 동작

@property(nonatomic, assign) NSUInteger timestamp; 
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime; 
@property(nonatomic, assign) NSUInteger endTime; 

나는이를 정리하는 방법을 찾을 수 있는지,하지만 이것이 내가 한 지점에서 함께 결국 무엇인가 내 프로젝트와 나는 타임 스탬프 속성이 올바른 타임 스탬프으로 설정된 경우에도 start30 속성에 액세스하는 이 항상 0을 반환한다는 것을 알았습니다.

그것은 내가 할 때, 타임 스탬프의 값을 전달하지 않는 기존 속성 (타임 스탬프)에 startTime을의 게터를 설정 한 것 같다

event.startTime => 0 
event.timestamp => 1340920893 

는 이러한 모든 그런데 타임 스탬프입니다.

위의 내용이 내 프로젝트에서 발생 했어야한다는 것을 알고 있지만 startTime에 액세스하면 타임 스탬프 속성으로 전달되지 않는 이유를 알 수 없습니다.

UPDATE 내 구현에서

나는이 모든 속성을 합성하거나 오전 :

@synthesize timestamp, endTime, startTime; 

GitHub의 내 요점에서 즉이 방법을 보여줍니다 사용 예를 들어 개체를 확인하시기 바랍니다 : https://gist.github.com/3013951

+0

무엇이 오류입니까? 'getter '로? –

+0

사실 내 대답이 잘못되었습니다. 동일한 선택자에 여러 속성이 연결되어있는 경우 중요하지 않습니다. 나는이 문제에 아무런 문제가 없다고 말할 것이다 ... –

+0

@ RichardJ.RossIII 나는 ARC 프로젝트의 최신 XCode에서 나의 테스트를 수행했다. 이것이 어떤 시점에서 Clang의 변화 일 수도 있습니다. – Joe

답변

5

설명 방법에서 귀하는 ivar에 액세스하는 속성을 사용하고 있지 않습니다.

-(NSString*) description 
{ 
    return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >", 
      timestamp, 
      self.startTime]; // <-- This is using the property accessor. 
} 

속성 - 대 - 바르 것은 항상 사람을 망쳐 놨, 그래서 잠시 그것에 대해에 산책하면서 실례 :

-(NSString*) description 
{ 
    return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >", 
      timestamp, 
      startTime]; // <-- This is accessing the instance variable, not the property. 
} 

이 당신을 위해 작동합니다. :) 이미이 모든 것을 알고 있다면 앞으로 건너 뜁니다. 위처럼

만들고 속성을 합성

는 두 가지 일이 :

  1. 바르가의 유형이 생성됩니다.
  2. getter 함수가 생성되어 해당 ivar이 반환됩니다. 포인트 약 2

중요한 부분은 기본적 바르 게터 함수 (따라서, 속성)는 동일한 이름을 가지고 있다는 것이다.

그래서이 :

@interface Event 
@property(nonatomic, assign) NSUInteger timestamp; 
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime; 
@end 

@implementation Event 
@synthesize timestamp, startTime; 
@end 

...이로 바뀝니다 :

NSUInteger foo = myEvent.startTime; 

정말 당신이 바르에 액세스 할 때, 당신이있어 말을

NSUInteger foo = [myEvent startTime]; 

그 모든 작업을 수행합니다

@interface Event { 
    NSUInteger timestamp; 
    NSUInteger startTime; 
} 
@end 

@implementation Event 
- (NSUInteger) timestamp { 
    return timestamp 
} 

- (void) setTimestamp:(NSUInteger) ts { 
    timestamp = ts; 
} 

- (NSUInteger) startTime { 
    return [self timestamp]; 
} 
@end 

어떻게 도트 구문 작동이가 있다는 것입니다 ... 잘, ivar에 접근했다. 속성을 사용할 때 값을 반환하는 함수를 호출하고 있습니다. 더 중요한 것은 구문이 매우 유사하기 때문에 다른 것을 의미 할 때 한 가지 일을하는 것이 매우 쉽습니다. 그것은 많은 사람들이 일상적으로 선도적 인 밑줄로 그들의 ivars를 종합하므로, 엉망이되기 어렵습니다.

@property(nonatomic, assign) NSUInteger timestamp; 
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime; 

@synthesize timestamp = _timestamp; 
@synthesize startTime = _startTime; 

NSLog(@"startTime = %d", _startTime); // OK, accessing the ivar. 
NSLog(@"startTime = %d", self.startTime); // OK, using the property. 
NSLog(@"startTime = %d", startTime); // NO, that'll cause a compile error, and 
             // you'll say "whoops", and then change it 
             // to one of the above, thereby avoiding 
             // potentially hours of head-scratching. :) 
+0

물론. 에 딱 맞다. 너무 복잡해서 복잡했습니다! 때때로 당신은 표면을 지나치게 찾고 깊숙히 무언가를보고 있습니다. 다시 나 자신에 의해 어리석은 질문 ... 대답 해 주셔서 감사합니다. 내가 보통 언더 코드 구현을 사용한다는 점에 흥미를 느끼지 만, 어떤 이유로이 클래스의 클래스는 매우 간단하고 더 적은 코드로 유지하기로 결정했다. 오늘의 수업 : 코딩 스타일을 유지하십시오. 오, 정말 미쳐 버리지 않고 스택 오버 플로우에 관해 질문하지 마십시오. – Daniel

1

확인 startTime에 대한 getter가 존재하도록 올바른 순서로 합성합니다.

//implementation 
@synthesize timestamp; 
@synthesize statTime; 
+0

나는이 주문에 특별한주의를 기울이지 않았다. 그러나 나는 그것을하고있다. 새로운 라인에서 synthesise를 구체적으로 설정할 필요가 없다면 말입니다. 나는 @ 합성을한다. p1, p2, p3; 어쩌면이 속성의 우선 순위를 지정하지 않을 수 있습니까? – Daniel

+0

어떤 컴파일러를 사용하고 있습니까? Apple LLVM 3.1을 사용하고 있으며 잘 작동합니다. – Joe

+0

같은 것을 사용하고 있습니다. 방금 샘플 코드에 대한 링크를 게시했습니다. 친절한 분이라면 측에서 테스트하십시오. – Daniel