2013-10-08 1 views
0

다음을 사용하여 languages ​​배열을 노출합니다.ARC를 사용하여 iOS에서 객체를 Retain 및 Readonly로 표시하는 방법은 무엇입니까?

@property(nonatomic,readonly)NSArray *languages; 

지정 언어 전에 ARC는 다음과 같이이었다 :

languages=[[NSArray arrayWithObjects: 
       [[Language alloc]initWithCode:@"es"], 
       [[Language alloc]initWithCode:@"en"], 
       nil] retain]; 

그래서, 내가 객체를 유지하고 또한 외부로 같은 읽기 전용으로 표시 할 수 모두 있었다.

ARC를 사용하는 경우 마찬가지로 "수동으로"입력 할 수 없습니다. setter 및 getter를 무시하지 않고 어떻게이 작업을 수행 할 수 있습니까? ARC에 대해 읽기 전용 (외부) 및 유지 (내부) 속성을 표시하는 방법이 있습니까?

+0

[objective-c ARC 읽기 전용 속성 및 개인 설정 도구 구현] 가능한 복제본 (http://stackoverflow.com/questions/8566671/objective-c-arc-readonly-properties-and-private-setter-implementation) – Rod

답변

3

retain * 및 readonly은 실제로 서로 관련이 없습니다. readonly은 속성에 setter가 아닌 getter 만 있음을 나타냅니다. retain은 클래스가 속성에서 참조하는 개체에 대한 보유 (강력한) 참조를 유지한다는 것을 의미하며 ARC에서 속성이 기본 합성 된 인스턴스 변수에 의해 뒷받침된다고 가정하면 인스턴스 변수가 __strong 변수임을 의미합니다.

외부 세계에 읽기 전용이지만 해당 클래스에서 읽고 쓸 수있는 속성을 원할 경우 구현 (.m) 파일의 클래스 확장에 readwrite으로 속성을 다시 선언 할 수 있습니다.

@property (nonatomic, strong, readonly) NSArray *languages; 

그런 다음하는 .m의 상단 : 헤더에

@interface YourClass() 
    @property (nonatomic, strong, readwrite) NSArray *languages; 
@end 

클래스의 구현 내부, 당신은 지금 언어를 설정합니다 (이니셜 또는 _languages = ...;) self.languages = ...;을 사용할 수 있습니다 재산. 이것은 ARC와 ARC가 아닌 다른 ARC와는 실제로 다르지 않습니다.

* 대신 strong을 사용하는 것이 더 관례이지만 컴파일러는 동일한 방식으로 처리합니다.

+3

속성이 기본적으로'readwrite'이므로 클래스 확장에서 속성을'readwrite'로 명시 적으로 선언 할 필요는 없습니다. – neilco

+1

그리고 바깥 세상에서는 객체가 읽기 전용 인 객체에만 액세스합니다. 클래스 내에서나 외부에서 동일한 NSArray가 참조됩니까? 호기심을 기쁘게하기 위해서 : 위의 두 속성을 모두 "원자 적"으로 설정하면 클래스 언어가 작성되고이 클래스 외부의 일부 객체가 그것을 읽으려고 할 때 수행 할 추가 작업이 있습니까? 감사. – Unheilig

+0

@neilco, 그건 사실입니다. 나는 무슨 일이 일어나고 있는지에 대해 노골적으로 선호한다. –

관련 문제