Objective-C Category Causing unrecognized selector

IphoneObjective CCocoaCategories

Iphone 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:

  1. You did not link UIImage+TTShare.m into your target. So while you have the header, you're not compiling the implementation.
  2. 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!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondevinrossView Question on Stackoverflow
Solution 1 - IphoneDave DeLongView Answer on Stackoverflow
Solution 2 - IphonelingView Answer on Stackoverflow
Solution 3 - IphoneClive PatersonView Answer on Stackoverflow
Solution 4 - IphoneH6.View Answer on Stackoverflow
Solution 5 - IphoneVoda IonView Answer on Stackoverflow
Solution 6 - IphoneNikolay SuvandzhievView Answer on Stackoverflow
Solution 7 - IphoneHlungView Answer on Stackoverflow
Solution 8 - IphoneWoop Dast1View Answer on Stackoverflow