gpt4 book ai didi

iOS - 应用程序在 Release模式下崩溃,但在 Debug模式下不会。 [__NFCString 计数] : unrecognized selector sent to instance xxx

转载 作者:行者123 更新时间:2023-11-28 19:57:15 36 4
gpt4 key购买 nike

我有一个类别 NSObject我在其中混合了valueForKeyPath:方法。如果 keyPath 包含 [] , 然后它假定该对象是一个 array并调用 objectAtIndex:给定索引的方法。

+ (void)load {
Method original, swizzled;

original = class_getInstanceMethod(self, @selector(valueForKeyPath:));
swizzled = class_getInstanceMethod(self, @selector(valueForExtendedKeyPath:));
method_exchangeImplementations(original, swizzled);
}

实现:

- (id)valueForExtendedKeyPath:(NSString * __autoreleasing *)keyPath {
token = keyPath;
container = self;
if([token hasPrefix:@"["]) {
NSExpression *expression;
NSInteger index, count;

count = [container count];
token = [token substringWithRange:NSMakeRange(1, token.length - 2)];
token = [token stringByReplacingOccurrencesOfString:@"@lastIndex" withString:[NSString stringWithFormat:@"%lu", (unsigned long)count - 1]];

expression = [NSExpression expressionWithFormat:token];
index = [[expression expressionValueWithObject:nil context:nil] integerValue];
if(index >= 0 && index < count) {
value = container[index];
}
}

我确保容器始终是 NSArray .在 debug mode ,应用程序运行良好,但在 Release mode ,应用程序崩溃并出现以下错误:

[__NFCString count]: unrecognized selector sent to instance xxx

最佳答案

尽量避免覆盖 Category 中的函数(在您的情况下为 valueForKeyPath),这会导致错误的结果。

在你上面的代码中,我没有看到你在这里转换了一些东西:container = self;(第 3 行)

尝试逐步调试:在 Release模式下你不能真正调试,但你可以像这样做一些内省(introspection):

NSLog(@"isString:%i", [self isKindOfClass:[NSString class]]);

关于iOS - 应用程序在 Release模式下崩溃,但在 Debug模式下不会。 [__NFCString 计数] : unrecognized selector sent to instance xxx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737231/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com