Saturday, February 25, 2012

iOS: Run-time error when using a class category in a different static library

When you are calling a member function defined in a class category ( from a different static library, you might see a run-time exception of "selector not recognized".

This is a well-know issue with Xcode and iOS. There is a technical note from Apple to describe the problem and the workaround by using the -all_load flag or the -force_load flag followed by the archive path:

There is also another workaround without defining the flag. In the file that define the class category, add a C function to the .h and .m, and call this function anywhere in the project that you call the member function of the class category. For example, if you have a class category called UIImage (A) in UIImage+A.h and UIImage+A.m, you can add a function like this:

// This function needs to be called in the file that uses UIImage (A)
void forceLoadUIImageCategoryA(void);

@interface UIImage (A)

void forceLoadUIImageCategoryA(void)
    // Do nothing

@implementation UIImage (A)

In the file that uses any member functions of UIImage (A), call forceLoadUIImageCategoryA(); anywhere. Calling this C function will make Xcode link the .h and .m.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.