1

プロトコルで宣言されたプロパティについていくつか質問があります。

戻り型の差異

@protocol IHaveProperties

@required

@property (nonatomic, strong) IAmOfTypeX *propertyOfProtocolType;
@property (nonatomic, strong) NSArray *array;

@end

@interface ClassThatHasProperties : NSObject<IHaveProperties>

@property (nonatomic, strong) ImplementationOfTypeX *propertyOfProtocolType;
@property (nonatomic, strong) NSMutableArray *array;

@end

さて、プロトコル/クラスの組み合わせでこれを試してみましたが、残念ながらコンパイルされました。

それはどのように機能しますか?これは技術的にインターフェースに準拠していませんか?

プロパティ宣言修飾子

@protocol IHaveProperty

@required

@property (nonatomic, strong, readonly) *example;

@end

@interface HaveProperty : NSObject<IHaveProperty>

@property (nonatomic, strong, readonly) *example;

@end

私の Mac は今再起動しているので、これを試すことはできませんが、プロトコル宣言にはそれを裏付けるものがないため、これで問題ないと思います。すべての修飾子が呼び出し元にとって重要なわけではなく、プロトコルを実装するクラスにとってのみ重要です。

4

1 に答える 1

0

<NSObject> Protocolを見ると、メソッドとプロパティが一緒に保持されていることがわかります。

@protocol NSObject

- (BOOL)isEqual:(id)object; @property (readonly) NSUInteger hash;

@property (readonly) Class superclass;
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead");
- (instancetype)self;

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

- (BOOL)isProxy;

- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

- (BOOL)respondsToSelector:(SEL)aSelector;

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

@property (readonly, copy) NSString *description; @optional @property
(readonly, copy) NSString *debugDescription;

@end

descriptionまたはsuperclassプロパティを使用している必要があります。関数と比較して、プロパティの処理方法に違いはありません。プロトコルを実装するクラスは、プロトコルのプロパティのゲッターおよび/またはセッターを提供します。同様に、デリゲート オブジェクトを所有するクラスは、そのプロパティを次のように呼び出します。self.delegate.propertyName.

于 2015-10-02T19:32:22.263 に答える