Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unrecognized selector calling category method in static iOS library

I am using some third party software to aid in writing an iPad application using Xcode 4.3.2. The software is open source and is usually set up so its code will be compiled along with whatever code the developer writes for the application. Because I was using the software in numerous places, I decided to build it as a static library for the iOS simulator.

I was able to build the library, and convert one application to link to that library instead of compiling the original source code. However, when I go to run the application on the simulator, I get an error that says, unrecognized selector sent to instance.

I have verified that the program is successfully using portions of the static library. However, there is one piece of code that tries to call a method on an object, and that where the failure occurs. The method being called is not actually defined in the interface of that object. Rather it is provided in an additional module that defines a category for that object's class. The header file for that module is properly included and the compiler should have been able to find the category method and apply it to the object, yet at run time, the error mentioned above occurs.

I used the 'nm' command to verify that the category method exists in the static library. Here is an example of the output:

nm libStaticLibrary.a | grep categoryMethod
00000130 t -[SomeClass(Category) categoryMethod:]
0000354c s -[SomeClass(Category) categoryMethod:].eh

What ideas do people have about how this library can be made to work correctly with the desired application?

like image 379
Tron Thomas Avatar asked May 04 '12 04:05

Tron Thomas


2 Answers

Your 3rd party framework is probable using a category on a existing (apple) class. But to load/find the category you need to add the -ObjC flag in the build settings under Other Linker Flags

buildsettings

like image 165
Pfitz Avatar answered Nov 19 '22 07:11

Pfitz


Pfitz answer is great, but this will cause the compiler to load a bunch of unused binaries to your project which is not what you want. Please refer to this answer to know why https://stackoverflow.com/a/22264650/1363997

Here is the best solution:

1) select your project target from the left panel (the folders navigator)
2) select "Build Phases" tap
3) expand "Compile Sources" cell
4) hit the plus button at the bottom and then add your category's .m file

Done!

Note: you have to search for the file by navigating through the folder by your self, don't type the file's name in the search field

like image 3
Basheer_CAD Avatar answered Nov 19 '22 08:11

Basheer_CAD