【发布时间】:2013-09-18 14:30:24
【问题描述】:
如果我执行以下操作,编译器不会抱怨:
id foo;
[foo retain];
但是,如果我执行以下操作,编译器会抱怨:
id<NSCopying> bar;
[bar retain];
具体来说:
Instance method '-retain' not found (return type defaults to 'id')
这是为什么?我认为id 指向一个通用的Objective-C 对象,我可以将retain 传递给任何Objective-C 对象。
请注意,这是一个警告,而不是错误,所以我仍然可以编译代码并且它似乎可以工作。我还注意到我可以执行以下操作来抑制警告:
[(id)bar retain];
但我认为id<NSCopying> 是id 的子类型,所以可以在id 上完成的任何事情都可以在id <NSCopying> 上完成...
【问题讨论】:
-
这里有一个小的上下文/概念差异,
id <NSCopying>真正的意思是“任何实现NSCopying但没有别的类的对象”,或者它是一个编译器错误。 -
使用
id<NSObject,NSCopying> bar消除问题。 -
能像
NSCopying* bar;这样说吗? -
@rmaddy 但这并不能回答“为什么”。
-
@H2CO3 不,你已经这样做了。我认为没有必要重复你所说的话。 :)
标签: ios objective-c release retain