3

내가 만든 클래스에 카테고리가 있으며이 카테고리는 구현시 속성이 필요한 프로토콜을 준수합니다. 그러나 카테고리에 속하기 때문에이 카테고리를 구현할 때 속성을 종합 할 수 없습니다. 이 때문에 setter 메서드를 구현하는 방법을 잘 모르겠다. 프로토콜의 속성을 읽기 전용으로 유지하면 괜찮 았기 때문에 필요한 것은 접근 메서드이기 때문이다.iOS 카테고리는 속성이있는 프로토콜을 준수합니다. 구현 방법

- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation 
{ 
    self.didDisplayRecommendation = didDisplayRecommendation; 
} 

하지만이 때 나는 컴파일러 오류를 얻을 :

내가 이렇게하면 내가 무한 루프를 얻을 수 있습니다 알고

@protocol SomeProtocol <NSObject> 
@property (nonatomic) BOOL didDisplayRecommendation; 
@end 

:

내 프로토콜입니다
- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation 
{ 
    _didDisplayRecommendation = didDisplayRecommendation; 
} 

didDisplayRecommendation은 프로토콜의 속성입니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 미리 감사드립니다!

+0

[오브젝티브 C 카테고리 및 새로운 바르] (의 중복 가능성 http://stackoverflow.com/questions/10502539/ –

+0

중복되지 않으며 프로토콜 준수 문제를 해결하지 않음 – Mason

+0

(at) 속성이있는 범주 (비 원자, 유지)에 "특수"속성을 추가 할 수 있습니다. MyClass * anObject -하지만 구현 파일에서 할 수있는 것은 동적 인 anObject 일 뿐이므로, Associative References cfunction을 사용하여 해당 속성 대신 다른 객체를 가장 할 수 있습니다. 작동하며 해결 방법이 아니며 상용 응용 프로그램에서이 작업을 수행 할 수 있으며 통과 프로토콜 구현을 통과합니다. – unmircea

답변

2
당신은 당신이 didDisplayRecommendation의 값을 보유하는 변수를 필요로하기 때문에 당신이 (카테고리와 함께이 일을 운이다, https://stackoverflow.com/a/13000930/171933

를 참조 카테고리를 통해 클래스에 인스턴스 변수를 추가 할 수 없습니다

당신이하지 않는 더럽혀지기를 원한다 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH3g-SW5).

아키텍처를 다시 생각하여 범주를 실제로 사용해야하는지 확인하는 것이 좋습니다. 서브 클래스 또는 심지어 Mixins이 더 좋은 방법 일 수 있습니다.

+0

MyClass * anObject (atat) 속성이있는 범주에 "특수"속성을 추가 할 수 있지만 구현 파일에서 수행 할 수있는 작업은 동적 anObject 일 뿐이므로 연관 참조 함수를 사용할 수 있습니다. 그 물건 대신에 다른 물건을 가장합니다. 작동하며 해결 방법이 아니며 상용 응용 프로그램에서이 작업을 수행 할 수 있으며 통과 프로토콜 구현을 통과합니다. – unmircea

+0

@unmircea 네, 확실히 기술적으로 가능합니다 **. 그러나 연관 참조에 의존해야하는 매우 강력한 이유가 있다고 생각합니다. –

0

프로토콜에 속성을 추가 할 때 해당 프로토콜을 @ 합성해야합니다. 당신도 @property 선언없이 사용할 수 있기 때문에

@implementation NSObject (AwesomeUtils) 

JESynthesize(assign, NSInteger, index, setIndex); 
JESynthesize(strong, NSString *, name, setName); 
JESynthesize(copy, void(^)(void), completion, setCompletion); 
JESynthesize(unsafe_unretained, id, unsafeObject, setUnsafeObject); 
JESynthesize(weak, id<UITableViewDelegate>, delegate, setDelegate); 
JESynthesize(strong, NSString *, readonlyID, changeReadonlyID); 

// … 
@end 

내가 따옴표 "속성"말 :

+4

Objective-C * 카테고리에서는 작동하지 않습니다. –

관련 문제