Re: Introspecting the current method
Re: Introspecting the current method
- Subject: Re: Introspecting the current method
- From: Jean-Daniel Dupas <email@hidden>
- Date: Mon, 19 Apr 2010 21:29:37 +0200
Le 19 avr. 2010 à 20:54, Greg Parker a écrit :
> 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.
If the test was [self class] == MyClass.class, it would be wrong, but this is not what he does, and AFAIK, [self class] returns self only for class objects.
> You can use `object_getClass(self) == self` instead. object_getClass() never lies.
It will never be true as this test is equivalent to self->isa == self, and isa is never self.
-- Jean-Daniel
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden