-->

Objective-C: preferred way to retrieve the supercl

2019-03-24 17:39发布

问题:

I am wondering which of the two following methods is the correct or preferred one to retrieve the superclass of a Class variable:

  1. Class getSuperclass(Class cls) { return [cls superclass]; }

  2. Class getSuperclass(Class cls) { return class_getSuperclass(cls); }

回答1:

Well, the docs on class_getSuperclass() say this:

You should usually use NSObject‘s superclass method instead of this function

So, I'd go with door #1.



回答2:

The accepted answer is technically correct (yes, that's what the docs say), and yet it's an incorrect answer.

[* superclass] only exists for objects that are subclasses of NSObject.

Yes, that's most of the classes you use day to day.

However ... there are many classes you might encounter which are not NSObject subclasses.

Easy example: if you iterate over "all loaded classes" (e.g. using objc_getClassList), then many of the returned classes will crash your app if you use the [Class superclass] method.



回答3:

I am positive they are absolutely identical, meaning that NSObject's superclass is implemented via class_getSuperclass. I am not sure, but I'd bet a beer on it.