Objective-C 프로토콜의 사용법이 다음과 같은 방식으로 사용되는 것을 보았습니다.
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
서브 클래스가 확장되는 구체적인 수퍼 클래스를 작성하는 대신이 형식이 사용되는 것을 보았습니다. 문제는이 프로토콜을 준수하면 속성을 직접 합성해야합니까? 수퍼 클래스를 확장하는 경우 대답은 '아니오'입니다. 그렇지 않아도됩니다. 그러나 프로토콜이 준수해야하는 속성은 어떻게 처리합니까?
이해하기 위해서는 여전히 이러한 속성이 필요한 프로토콜을 따르는 개체의 헤더 파일에서 인스턴스 변수를 선언해야합니다. 이 경우, 그것들이 단지 지침 원칙이라고 가정 할 수 있습니까? 필요한 방법의 경우도 마찬가지입니다. 프로토콜은 프로토콜이 나열하는 필수 방법을 제외하기 위해 손목을 때립니다. 속성 뒤에 숨겨진 이야기는 무엇입니까?
다음은 컴파일 오류를 생성하는 예입니다 (참고 : 현재 문제를 반영하지 않는 코드를 다듬 었습니다).
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end