에이코와 다른 사람들이 정답을주었습니다.
더 간단한 방법은 다음과 같습니다 . 전용 멤버 변수에 직접 액세스합니다.
예
헤더 .h 파일에서 :
@property (strong, nonatomic, readonly) NSString* foo;
구현 .m 파일에서 :
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
그게 전부입니다. 소란스럽지 않고 소란스럽지 않습니다.
세부
Xcode 4.4 및 LLVM 컴파일러 4.0 ( Xcode 4.4의 새로운 기능)부터는 다른 답변에서 논의 된 집안일을 엉망으로 만들 필요가 없습니다.
synthesize
키워드
- 변수 선언
- 구현 .m 파일에서 속성을 다시 선언합니다.
속성을 선언 한 후 foo
Xcode가 underscore : 접두사로 명명 된 전용 멤버 변수를 추가했다고 가정 할 수 있습니다 _foo
.
속성이 선언 된 readwrite
경우 Xcode는 명명 된 getter 메서드 foo
와 명명 된 setter를 생성합니다 setFoo
. 이러한 메서드는 점 표기법 (my Object.myMethod)을 사용할 때 암시 적으로 호출됩니다. 속성이 선언 된 경우 readonly
setter가 생성되지 않습니다. 이는 밑줄로 명명 된 백업 변수 자체가 읽기 전용 이 아님을 의미합니다. readonly
에는 세터 방법은 값을 설정 도트 표기법 따라서 합성하지시키고 단순히 수단 컴파일러 에러 실패. 컴파일러가 존재하지 않는 메서드 (세터) 호출을 중지하기 때문에 점 표기법이 실패합니다.
이 문제를 해결하는 가장 간단한 방법은 밑줄로 명명 된 멤버 변수에 직접 액세스하는 것입니다. 밑줄로 명명 된 변수를 선언하지 않아도 그렇게 할 수 있습니다! Xcode는 빌드 / 컴파일 프로세스의 일부로 해당 선언을 삽입하므로 컴파일 된 코드에는 실제로 변수 선언이 있습니다. 그러나 원래 소스 코드 파일에서는 이러한 선언을 볼 수 없습니다. 마술이 아니라 문법적인 설탕 .
사용 self->
은 개체 / 인스턴스의 멤버 변수에 액세스하는 방법입니다. 이를 생략하고 var 이름 만 사용할 수 있습니다. 그러나 나는 내 코드를 자체 문서화하기 때문에 self + arrow를 사용하는 것을 선호합니다. 당신이 볼 때 self->_foo
당신은 모호함없이 알고 _foo
이 인스턴스의 멤버 변수입니다.
그건 그렇고, 재산 접근 자의 장단점과 직접 ivar 접근에 대한 논의는 Matt Neuberg 박사 의 Programming iOS 책 에서 읽을 수있는 사려 깊은 대우 입니다. 읽고 다시 읽는 것이 매우 도움이된다는 것을 알았습니다.