今天将app统计的.a静态库包含到一个app应用中,调试时报下面的错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSDictionary dictionaryWithJSONString:error:]: unrecognized selector sent to class 0x235e7ec'
unrecognized selector sent to class 0x235e7ec'
*** First throw call stack:
(
0 CoreFoundation 0x022195e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01f288b6 objc_exception_throw + 44
2 CoreFoundation 0x022b67a3 +[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x0220990b ___forwarding___ + 1019
4 CoreFoundation 0x022094ee _CF_forwarding_prep_0 + 14
...
10 Foundation 0x01b80597 -[NSThread main] + 76
11 Foundation 0x01b804f6 __NSThread__main__ + 1275
12 libsystem_c.dylib 0x02d625b7 _pthread_start + 344
13 libsystem_c.dylib 0x02d4cdce thread_start + 34
)
libc++abi.dylib: terminating with uncaught exception of type NSException
纠结了好久,定位代码错误位置如下:
-
NSString *retString = [network SendData:url data:requestDictionary];
-
NSError *error = nil;
-
NSDictionary *retDictionary = [ NSDictionary dictionaryWithJSONString:retString error:&error];
-
if(!error)
-
{
-
ret.flag = [[retDictionary objectForKey:@\"flag\" ] intValue];
-
ret.msg = [retDictionary objectForKey:@\"msg\"];
-
}
-
return ret;
- }
自定义对象代码如下:
-
@implementation NSDictionary (NSDictionary_JSONExtensions)
-
-
+ (id)dictionaryWithJSONData:(NSData *)inData error:(NSError **)outError
-
{
-
return([[CJSONDeserializer deserializer] deserialize:inData error:outError]);
-
}
-
-
+ (id)dictionaryWithJSONString:(NSString *)inJSON error:(NSError **)outError;
-
{
-
NSData *theData = [inJSON dataUsingEncoding:NSUTF8StringEncoding];
-
return([self dictionaryWithJSONData:theData error:outError]);
-
}
-
- @end
推断出问题的可能原因后,很有可能是工程的setting信息有问题。于是开始一个一个参数过,一开始以为是Search Paths的各种路径配置错误,后来验证不是。否则编译都应该过不去。
于是,将范围定在Build Settings下的Linking的参数列表。马上有一个参数映入眼帘:Other Linker Flags,没有设置。通过google,查询相关说明:
-all_load Loads all members of static archive libraries.
-ObjC Loads all members of static archive libraries that implement an Objective-C class or category.
-force_load (path_to_archive) Loads all members of the specified static archive library. Note: -all_load forces all members of all archives to be loaded. This option allows you to target a specific archive.
翻译过来就是-all_load就是会加载静态库文件中的所有成员,-ObjC就是会加载静态库文件中实现一个类或者分类的所有成员,-force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员。所以对于使用runtime时候的反射调用的方法应该使用这三个中的一个进行link,以保证所有的类都可以加载到内存中供程序动态调用
到这里,基本就明白了,就是这个参数没有设置的原因。将Other Linker Flags=-ObjC,再重新调试,运行成功!!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12231606/viewspace-1081952/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12231606/viewspace-1081952/
本文讨论了一个在iOS app中遇到的问题,即使用自定义的JSON解析类时,遇到了无法识别的selector错误。通过分析错误堆栈和代码逻辑,最终发现问题是由于混淆了自定义类的`dictionaryWithJSONString:error:`方法与内置的`NSDictionary`类的同名方法,导致Xcode未能正确解析并加载自定义类。解决办法是在build settings的Other Linker Flags中添加 `-ObjC` 参数,确保所有静态库成员被加载。

7975

被折叠的 条评论
为什么被折叠?



