开发者

So where is this calling super?

From the Core Data docs:

Inheritance If you have two subclasses 开发者_运维百科 of NSManagedObject where the parent class implements a dynamic property and its subclass (the grandchild of NSManagedObject) overrides the methods for the property, those overrides cannot call super.

@interface Parent : NSManagedObject
@property(nonatomic, retain) NSString* parentString;
@end

@implementation Parent
@dynamic parentString;
@end

@interface Child : Parent
@end

@implementation Child
- (NSString *)parentString
{
    // this throws a "selector not found" exception
    return parentString.foo;
}
@end

very, very funny, because: I see nobody calling super. Or are they? Wait... parentString.foo results in ... a crash ??? it's a string. How can that thing have a .foo suffixed to it? Just another documentation bug?


I think the example is garbled.

I pretty sure the inheritance issue is caused because @dynamic methods are created by the runtime. The complier does not attempt to create a symbol for them. If the parent class isn't instantiated, I don't think the methods even exist at all. Therefore, its really impossible for a subclass instance to have a live selector/symbol to call.

It's a tradeoff necessary for automatic runtime code generation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜