Objective c 从同一类的类方法中了解实例类型的最佳方法是什么?

Objective c 从同一类的类方法中了解实例类型的最佳方法是什么?,objective-c,Objective C,我想学习如何使类方法返回instancetype值,而不是id 简单演示: @implementation MyGenericManagedObject + (instancetype)existingObjectByObjectID:(NSManagedObjectID *)objectID { return (__typeof([self alloc]))[managedObjectContext() existingObjectWithID:objectID error:nil];

我想学习如何使类方法返回
instancetype
值,而不是
id

简单演示:

@implementation MyGenericManagedObject
+ (instancetype)existingObjectByObjectID:(NSManagedObjectID *)objectID {
    return (__typeof([self alloc]))[managedObjectContext() existingObjectWithID:objectID error:nil];
}
以这种方式编写此方法确实有效,但如果我删除
([self alloc])
我开始将“不兼容的指针类型强制转换为'NSManagedObject*'类型'MyGenericManagedObject*”


从同一类的类方法内部获取实例类型的正确方法是什么?

existingObjectWithID:error:
显式类型转换为返回
NSManagedObject*
。坦率地说,这是API中的一个错误,您应该将其归档

因此,你需要演员阵容

@implementation MyGenericManagedObject
+ (instancetype)existingObjectByObjectID:(NSManagedObjectID *)objectID {
    return (id)[managedObjectContext() existingObjectWithID:objectID error:nil];
}

只需转换到
id
就可以了。

对不起,我不明白你的答案:1)这里到底有什么bug?2)我在我的示例中做错了什么吗?或者至少保持这种形式是可以的,如果没有更好的方法是不可能的话?请你说得更详细一点好吗?我不认为这实际上是bug。我唯一能做的是s返回一个
id
,我不认为这会更好。这是一个bug;
NSManagedObject
可以返回子类,因此该API应该声明为返回
id
。理想情况下,有一种方法可以声明返回该类或子类的实例,而不需要在rece上显式转换iving侧(带有
类:
检查,防御),但这是不可能的。似乎做到了。我自己怎么能忘记这个选项…谢谢!@Stanislaw注意这不是一个非常聪明的解决方案。你至少应该添加一个
isKindOfClass
测试来检查你是否真的拥有你需要的实例。如果你传递了一个无效的ObjectID,你仍然会得到一个无效的对象。谢谢r这个提醒,@Sulthan。我会处理所有这些。我创建这个示例只是为了演示。