On Apr 18, 2010, at 7:01 PM, Ken Thomases wrote:
> On Apr 18, 2010, at 7:14 PM, Dave DeLong wrote:
>> If I'm inside a method, is there a way to know at runtime whether that 
>> method is a class or an instance method?
> 
> Keep in mind that class methods are just instance methods, where the instance 
> is the class object.  (The class object being an instance of its metaclass.)
> 
> So, in a deep sense, there's no distinction between a class method and an 
> instance method.  There's only the receiver object and the message/selector.

Absolutely correct. But in practice, you can distinguish between class and 
instance methods everywhere except the root class.

The methods for a non-class instance are:
* your class's instance methods
* any superclass instance methods
* NSObject's instance methods

The methods for a class instance are:
* the class's class methods
* any superclass class methods
* NSObject's class methods
* NSObject's instance methods

That last line is the weird one. It's caused by the twist at the top of the 
instance/class/metaclass diagram that makes all class objects into instances of 
their root class (usually NSObject). 
http://sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

Comparing the two lists, you can see that the only overlap is NSObject's 
instance methods. Everywhere else, you'll find that class methods are called on 
class objects only, and instance methods are called on non-class objects only. 
So "is self a class" will distinguish instance methods from class methods, as 
long as you aren't writing instance methods on NSObject.

Note that `[self class] == self` is the wrong check. Some classes lie about 
[self class]. One specific case is KVO. On some OS versions, KVO creates 
subclasses of observed classes at runtime. The subclasses override accessor 
methods to add willChange/didChange notifications. The KVO-generated subclasses 
override [self class] to return the non-KVO superclass instead of the 
KVO-generated subclass.

You can use `object_getClass(self) == self` instead. object_getClass() never 
lies.

-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to