1.21. Determining Whether a Class Is Available at Runtime

Problem

You are using a few classes that are available in the latest SDK but you are unsure whether they are available on devices that will be running your app, because your deployment target is earlier than the latest SDK.

Solution

Use the NSClassFromString function. Pass the name of your class to this method as a string. If the return value of this function is nil, that class is not available on the device that runs your app; otherwise, that class is available on the device and you can go ahead and use it as you wish. Here is an example:

if (NSClassFromString(@"NSJSONSerialization") != nil){

  /* You can use this class */
  [NSJSONSerialization JSONObjectWithData:...   /* Put data here */
                                  options:...   /* Put options here */
                                    error:...]; /* Handle errors here */

} else {

  /* That class is not available */

}

Discussion

It’s no secret that users are slow in upgrading their operating systems. Working for various companies, I can confirm that usually around 30% of iOS devices today are running versions of iOS that are about a year or a year and a half old. For instance, if today we are working with iOS 5, there are still iOS devices out there running iOS 3. Revenue is important to developers, so we need to make sure that we support older devices to some extent, so that we can create a bigger user base than we would by pushing out an app that only runs on iOS 5.

Some of the classes that we use are available only on specific versions of iOS. For instance, the NSJSONSerialization class is available only in iOS 5 SDK and only devices running iOS 5 will be able to run such code. However, if you are planning to support iOS 4 as well as iOS 5, then you can, at runtime, detect the availability of the aforementioned class using the NSClassFromString function, and pass the name of the class that you want to use as a parameter to this function. If the return value of this function is nil, that means the class that you specified cannot be instantiated on the specific device running your app. In this situation, you will need to choose an alternative path and instantiate another class that is available on the device, which carries out similar functionalities as the absent class.

Get iOS 5 Programming Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.