【问题标题】:Clarification needed about the rules of properties declared in protocols需要澄清协议中声明的属性规则
【发布时间】:2023-04-06 05:42:01
【问题描述】:

我有几个关于协议中声明的属性的问题。

返回类型差异

@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 正在重新启动,因此我无法尝试此操作,但我认为这没关系,因为协议声明没有任何支持。调用者不会对所有修饰符感兴趣,只会对实现协议的类感兴趣。

【问题讨论】:

  • 协议应该只包含方法而不是变量。您不能访问协议中的变量
  • 属性不是变量;它们方法,不是吗?它们只是看起来/感觉像是字段,但它们实际上是 getter 和/或 setter
  • 创建getter和setter方法来设置和获取存储在属性(变量)中的值
  • 对,但变量/字段仅在您执行@synthesize 时才会生成,前提是您在协议中声明属性然后实现它

标签: objective-c properties objective-c-protocol


【解决方案1】:

如果你查看&lt;NSObject&gt;协议,你可以看到它把方法和属性放在一起:

@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

您必须使用过descriptionsuperclass 属性。与函数相比,如何处理属性没有区别。实现协议的类将提供协议属性的 getter 和/或 setter。类似地,拥有委托对象的类将调用其属性,如:self.delegate.propertyName.

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多