Objective-C Category Causing unrecognized selector
IphoneObjective CCocoaCategoriesIphone Problem Overview
My project has a UIImage
category function that I want to call from another class. I properly import the header file for the image category and I get the project to compile with no warning.
The problem is that when I call the UIImage
category function I seen an unrecognized selector error with a NSInvalidArgumentException
. Why am I seeing this if I've properly linked everything?
#import <UIKit/UIKit.h>
@interface UIImage (DRShare)
+ (UIImage*) imageNamed:(NSString*)name;
@end
@implementation UIImage (DRShare)
+ (UIImage*) imageNamedDR:(NSString*)name{
CGFloat s = 1.0f;
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
s = [[UIScreen mainScreen] scale];
}
NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""];
return [UIImage imageWithContentsOfFile:DRBUNDLE(path)];
}
@end
file that calls it:
backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];
exception raised:
2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938
2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938'
*** Call stack at first throw:
(
0 CoreFoundation 0x02e65b99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x02fb540e objc_exception_throw + 47
2 CoreFoundation 0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x02dd72b6 ___forwarding___ + 966
4 CoreFoundation 0x02dd6e72 _CF_forwarding_prep_0 + 50
5 TapTapShare 0x0001291c -[DRShareViewController backgroundView] + 127
6 TapTapShare 0x00012343 -[DRShareViewController loadView] + 639
7 UIKit 0x0044f54f -[UIViewController view] + 56
8 UIKit 0x0044d9f4 -[UIViewController contentScrollView] + 42
9 UIKit 0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
10 UIKit 0x0045bea3 -[UINavigationController _layoutViewController:] + 43
11 UIKit 0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524
12 UIKit 0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
13 UIKit 0x00574b55 -[UILayoutContainerView layoutSubviews] + 226
14 QuartzCore 0x02616481 -[CALayer layoutSublayers] + 177
15 QuartzCore 0x026161b1 CALayerLayoutIfNeeded + 220
16 QuartzCore 0x026160bd -[CALayer layoutIfNeeded] + 111
Iphone Solutions
Solution 1 - Iphone
A couple possibilities:
- You did not link
UIImage+TTShare.m
into your target. So while you have the header, you're not compiling the implementation. - If this is part of a static library, you need to add
-all_load
to the Other Linker Flags build setting for the app linking against the library.
Solution 2 - Iphone
If you want to use Category method, you must add -ObjC to the Other Linker Flags build setting of your APP.
Solution 3 - Iphone
I had the same issue and had to apply this fix as well. My NSDate-Extensions.m source file wasn't compiling so I had to go into Project Settings, then select the appropriate target, then click the "Build Phases" tab, then expand the "Compile Sources" items, then click the + symbol and manually add my NSDate-Extensions.m file.
Solution 4 - Iphone
I had this error message and I am using Cocoapods. To fix the error, I just needed to call pod install
again to create all the necessary linking correctly.
Solution 5 - Iphone
Another possibility.
You have the implementation of category but do not have an interface. I mean you forgot to declare in *.h the interface of your category.
Solution 6 - Iphone
Yet another possibility:
This is almost too embarrassing to admit, but just in case someone might have done the same silly mistake:
I was copying code from one project to another, and by mistake I had pasted the same source code in the .h
file and the .m
file (in both I had put the code meant for the .h
file). I fixed my .m
file and it worked.
Solution 7 - Iphone
May be because you write imageNamed
instead of imageNamedDR
in the interface..
Solution 8 - Iphone
The sdk hybrid project created on the basis of oc will crash when it is called by the swift file in the sdk-related hybrid demo project, prompting that the oc classification method in the sdk cannot be found. I try to put the compiled package in the link binary with libraries(build phase-link binary with libraries), it works! It is not enough to just set the dependencies of the demo to associate the SDK. It can be regarded as a pit of mixed sdk and mixed demo project!