에이코와 다른 사람들이 정답을 준
에서 MyClass.h.
다음은 더 간단한 방법입니다. private 멤버 변수에 직접 액세스하십시오.
그것 뿐이다 // inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
, 즉 당신이 필요로하는 모든입니다 : 구현하는 .m 파일에서
@property (strong, nonatomic, readonly) NSString* foo;
: .H 파일 헤더에서
예
. 불평, 호들갑.
에 대한 자세한 사항은 엑스 코드 4.4 LLVM 컴파일러 4.0 (New Features in Xcode 4.4)의로
, 당신은 다른 답변에서 논의 된 집안일 엉망 필요가 없습니다 :
synthesize
키워드
- 선언을 변수
- 구현 .m 파일의 속성을 다시 선언하십시오.
_foo
을 :
속성 foo
를 선언 한 후, 당신은 엑스 코드는 밑줄의 접두어로라는 이름의 개인 멤버 변수를 추가했습니다 가정 할 수있다.
속성이 readwrite
으로 선언 된 경우 Xcode는 foo
이라는 getter 메서드와 setFoo
이라는 세터를 생성합니다. 이러한 메서드는 내 표식 (my Object.myMethod)을 사용할 때 암시 적으로 호출됩니다. 속성이 readonly
으로 선언 된 경우에는 setter가 생성되지 않습니다.즉, 밑줄로 이름 지은 백킹 변수는 이 아니며은 읽기 전용입니다. readonly
은 단순히 setter 메서드가 합성되지 않았기 때문에 점 표기법을 사용하여 값을 설정하면 컴파일러 오류가 발생하여 실패합니다. 컴파일러가 존재하지 않는 메서드 (setter)를 호출하지 못하기 때문에 점 표기법이 실패합니다.
가장 간단한 방법은 밑줄로 명명 된 멤버 변수에 직접 액세스하는 것입니다. 밑줄 친 변수를 선언하지 않아도 그렇게 할 수 있습니다! Xcode는이 선언을 빌드/컴파일 프로세스의 일부로 삽입하므로 컴파일 된 코드는 실제로 변수 선언을 갖습니다. 그러나 원래의 소스 코드 파일에서 그 선언을 결코 볼 수 없습니다. 마법이 아닙니다. 단지 syntactic sugar입니다.
self->
을 사용하면 개체/인스턴스의 멤버 변수에 액세스 할 수 있습니다. 이를 생략하고 var 이름 만 사용할 수 있습니다. 그러나 자기 코드를 스스로 문서화하기 때문에 self + arrow를 사용하는 것을 선호합니다. self->_foo
을 보면 모호하지 않고 _foo
이이 인스턴스의 멤버 변수임을 알 수 있습니다. 그런데
는 프로와 직접 바르 액세스 대 속성 접근의 단점에 대한 논의는 정확히 박사 Matt Neuberg의 Programming iOS 책에서 읽을 수 있습니다 사려 깊은 치료의 일종이다. 나는 그것을 읽고 다시 읽는 것이 매우 도움이된다는 것을 알았다.
헤더 파일에 노출하지 않고 설정기를 수동으로 정의하는 것 외에도 AFAIK가 유일한 다른 방법입니다. – BoltClock
아! 카테고리를 추가하십시오! 이것은 정확히 내가 겪은 것입니다. 너 락! 최대한 빨리 답변을 수락 ... :) – Alex
이것은 카테고리가 아닙니다. 그것은 클래스 연장입니다 (에이코가 말했듯이). 그들은 유사한 목적으로 사용되었지만 분명히 다르다. 예를 들어 위의 내용을 진정한 범주에서 수행 할 수는 없습니다. – bbum