gpt4 book ai didi

ios - Obj-c 协议(protocol)属性未在符合类中实现

转载 作者:可可西里 更新时间:2023-11-01 03:33:08 25 4
gpt4 key购买 nike

问题


我遇到了一个有趣的问题,但找不到任何关于它的文档...有时 protocol 中声明的 properties 不是在符合该 protocol 的特定类中实现并发生运行时异常。 dynamic property 定义是否在某些奇怪的情况下被优化掉了? protocols 不能与被声明为dynamicproperties 一起使用吗?任何对此的见解将不胜感激。

下面是一些更多的细节。

给定一个协议(protocol):

@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someProperty;
@end

和一个实现协议(protocol)的类,如下所示:

@interface MyClass <MyProtocol>
@end

@implementation MyClass
@dynamic someProperty;
@end

我注意到有时我无法通过调用获得任何信息

class_getProperty(myClass, propertyName);

用于协议(protocol)中的属性。这只发生在一些类中,而且似乎是零星的。

我正在运行最新的 Xcode 4 并链接到 iOS 6 SDK。我确实在同一台机器上安装了预发布的 Xcode 5,尽管它不是默认的(通过 xcode-select)。

例子


如果你运行这段代码:

@protocol MyProtocol <NSObject>

@property (nonatomic, strong) id someData;

@end

@interface MyObject : NSObject <MyProtocol>

@end

@implementation MyObject

@dynamic someData;

@end

然后你跑

const char *name = [@"someData" UTF8String];
objc_property_t property = class_getProperty([MyObject class], name);
const char *attributes = property_getAttributes(property);

即使 property 不存在,您也将获得有关 property 的元数据。换句话说,您不需要综合属性来获取它的属性。运行时仍然知道它。自己试试吧。问题是有时这不会发生。我想知道导致运行时不知道 property 属性的条件。

临时修复


我的临时解决方法是只复制 protocol 中的所有 property 定义并将它们粘贴到 .h 文件中:

@interface MyClass <MyProtocol>
@property (nonatomic, strong) id someProperty;
@end

@implementation MyClass
@dynamic someProperty;
@end

这运行良好,但远非理想。但是,它表明我的代码工作正常,问题出在其他地方。

如果需要,我很乐意提供更多详细信息或背景。

最佳答案

协议(protocol)定义方法、可选方法和必需方法。

属性是抽象的方法,如果协议(protocol)将属性定义为必需的,那么您必须实现所需的方法:通常使用 @synthesize...但可以通过其他方式完成

(假设非脆弱的 ABI/现代运行时)为简单起见使用 readonly

@property(readonly)int dog;

可以实现:

@synthesize dog;

@synthesize dog = _dog; // synthesize standard getter for the iVar _dog

- (int) dog
{
return _dog; // or dog, or cat/5 or 5 or whatever
}

编辑:重新动态属性

@dynamic 是一个关键字,它不会生成满足属性要求的方法,它所做的只是通知编译器它已以其他方式“得到处理”。 ..

这种动态分派(dispatch)可以在运行时通过几种不同的方法来完成,一种是在运行时添加方法实现,另一种是使用未解析选择器的运行时。 (我有一个关于使用动态属性在字典中使用通用 KV 存储的类似问题)

参见:Using NSMutableDictionary as backing store for properties

关于ios - Obj-c 协议(protocol)属性未在符合类中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17577239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com