-2

我在尝试记录 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:

有人对这里可能有什么问题有什么建议吗?

4

2 回答 2

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它不是 class 的有效选择器NSString

你为什么不试试下面的,看看它给你什么:

%hook UserData
-(int)getVariable:(id)fp8 {

    %log(@"fp8: %@ : %@\n", NSStringFromClass([fp8 class]), [fp8 description]);

    return %orig;
}
%end
于 2013-11-30T11:20:32.790 回答
0

如果您打印描述,它应该可以工作。以下方式:

NSLog(@"%@", [dictionary description]);
于 2013-11-29T19:36:09.470 回答