【问题标题】:How to create an instance of any type (id) in Objective-c如何在 Objective-c 中创建任何类型(id)的实例
【发布时间】:2011-11-25 09:08:30
【问题描述】:

我有一个 NSArray 实例,其中包含一些类型的对象 (NSDictionary)..

我需要将此 Array 复制到某个运行时已知类型的 NSArray。

所以我需要创建运行时已知类型的实例并将 NSDictionary 的内容复制到其中。

我实际上已经创建了这些 NSObject 类型的实例,但是当在头后查询它时,我得到了unrecognized selector 错误!

NSUInteger count = [value count];
NSMutableArray* arr = [[NSMutableArray alloc]initWithCapacity:count];

if (count > 0)
{
    for (int i=0; i < [value count]; i++)
    {
        id newObj = [[NSObject alloc] init];
        id currentValue = [value objectAtIndex:i];
        [self objectFromDictionary:currentValue object:newObj];
        [arr addObject:newObj];
    }
}

[arr release];

编辑: objectFromDictionary 忘了它,它所做的是检查 newObj 的属性并通过字典中的值设置它。它的工作做得很好。

EDIT 2:

请看看我为什么要这样做:

Type of objects inside non-parameterized arrays in JSON

【问题讨论】:

  • 你的objectFromDictionary:object: 到底应该做什么,你应该发布代码,因为分配一个 NSObject 通常是没有意义的。
  • 这不是 NSCopying copyWithZone 的用途吗?只要您要复制的对象实现了 copyWithZone 它应该可以工作。如果对象没有实现 copyWithZone 你就完蛋了。

标签: iphone objective-c introspection objective-c-runtime


【解决方案1】:

变化:

id newObj = [[NSObject alloc] init];

到:

id newObj = [[NSMutableArray alloc] init];

或:

id newObj = [[NSClassFromString(@"NSMutableArray") alloc] init];

或者,如果您想从现有对象派生类:

id newObj = [[[existingObj class] alloc] init];

【讨论】:

  • 它不是NSMutableArray,直到运行时才属于某种未知类型
  • 然后使用我列出的另一个选项。
  • 什么选项? NSClassFromString?在我找到某种方法在运行时检查它之前,我没有该类型
  • “在运行时检查”是什么意思?如果你已经有一个正确类的对象,你可以[[[obj class] alloc] init]
  • Muhammad,目前问题没有提出,因为请说明您在运行时如何知道类型以及如何尝试使用它,Ole Begemann 已经提供了足够的示例来实现运行时类分配。如果这些对您尝试做的事情不起作用,那么您可能采用了不正确的方法来解决您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2010-11-13
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多