我有一个问题,我尝试记录NSDictionary内容,一旦调用该方法,应用程序崩溃。
这是我在一位才华横溢的“黑客”的建议后尝试过的代码:
%hook UserData
-(int)getVariable:(NSDictionary *)fp8 {
for (NSString *key in [fp8 allKeys]) {
%log(@"key: %@, value: %@ \n", key, [fp8 objectForKey:key]);
}
return %orig;
}
%end
也尝试过:
%hook UserData
-(int)getVariable {
int originalValue = %orig;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSError *error;
[[fp8 description] writeToFile:[NSString stringWithFormat:@"%@/lol_%d.txt",basePath,fp8.count] atomically:NO encoding:NSUTF8StringEncoding error:&error];
return %orig;
}
%end
这两种方式都会导致应用崩溃。这是在带有ios 6.1.3系留JB的iphone 4上。
DoD EN[1000]: -[__NSCFConstantString allKeys]: unrecognized selector sent to instance 0x2a7a88
DoD EN[1000]: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString allKeys]: unrecognized selector sent to instance 0x2a7a88'
*** First throw call stack:
有没有人对这里的错误提出建议?
答案 0 :(得分:2)
崩溃日志提供了相当多的解释
-[__NSCFConstantString allKeys]: unrecognized selector sent to instance 0x2a7a88
我想这是与您发布的第一段代码相关联的崩溃日志:
%hook UserData
-(int)getVariable:(NSDictionary *)fp8 {
for (NSString *key in [fp8 allKeys]) {
%log(@"key: %@, value: %@ \n", key, [fp8 objectForKey:key]);
}
return %orig;
}
%end
在执行[fp8 allKeys]
时崩溃,声称allKeys
不是类__NSCFConstantString
对象的有效选择器
它告诉你的是fp8
不是 NSDictionary*
而是__NSCFConstantString*
(也就是指向NSString
的常量实例的指针例如像NSString* foo = @"bar"
)那样的定义。
如果确实如此,那么您发布的第二个代码也会崩溃,因为count
不是类NSString
的有效选择器。
为什么不试试以下内容,看看它给你的是什么:
%hook UserData
-(int)getVariable:(id)fp8 {
%log(@"fp8: %@ : %@\n", NSStringFromClass([fp8 class]), [fp8 description]);
return %orig;
}
%end
答案 1 :(得分:0)
如果您打印描述,它应该有效。以下方式:
NSLog(@"%@", [dictionary description]);