gpt4 book ai didi

iphone - 如何在运行时动态地将 id 类型转换为具体类?

转载 作者:行者123 更新时间:2023-12-03 16:24:16 24 4
gpt4 key购买 nike

我有多个数据源用于一个 UIViewController。我的 View Controller 使用 KeyValue 观察来跟踪运行时某些属性的状态。当我交换数据源时,我需要停止观察这些属性。问题是,我不确定运行时数据源的类,因此这样的东西是无效的:

if (aDataSource != dataSource) {
// Ensure we stop observing the existing dataSource, otherwise bad stuff can happen.
[dataSource removeObserver:self forKeyPath:@"someKeyPath"]; // not valid, compiler doesn't know what class dataSource is.
[dataSource release];
dataSource = [aDataSource retain];
}

编译器需要一个具体的类才能知道对象的接口(interface)。在这种特殊情况下,如何获取 dataSource 的类,然后为上面的removeObserver:forKeyPath: 选择器类型化 dataSource?我更喜欢动态/智能的东西,而不是在 NSString 实例中缓存类的名称并在每次切换时引用它。意思是,我总是可以做这样的事情:

NSString *lastDataSource = @"MyClass";
Class foo = [NSClassFromString(lastDataSource)];

谢谢。

最佳答案

  1. 如果你这样编码:

    id foo = ...;
    [foo removeObserver:self forKeyPath:@"someKeyPath"];

    编译器会很好地处理它,因为类型为 id 的对象接受任何消息(只要编译器知道签名)。

  2. 现在,如果您有:

    id<NSObject> foo = ...;
    [foo removeObserver:self forKeyPath:@"someKeyPath"];

    编译器会给你一个警告:

    warning: '-removeObserver:forKeyPath:' not found in protocol

    这是因为您引用的是协议(protocol) NSObject,而不是定义 KVO 方法的 NSObject 类。

  3. 但是如果你有:

    NSObject* foo = ...;
    [foo removeObserver:self forKeyPath:@"someKeyPath"];

    这也可以很好地编译,因为在本例中您使用的是 NSObject 类。

相关链接:

关于iphone - 如何在运行时动态地将 id 类型转换为具体类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/899068/

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