iOS 6和7返回的结果不同。

5
似乎我们使用 `getPropertyType(..)` 函数的应用在 iOS 7 上出现了故障。由于某种原因,例如 NSString 属性返回的类型不再是简单的 NSString,而是 `NSString$'\x19\x03\x86\x13'`,而 NSNumber 属性返回的类型也不再是简单的 NSNumber,而是 `NSNumber\xf0\x90\xae\x04\xff\xff\xff\xff`。这些问题在稍后检查特定类型时都会导致一些棘手的问题。我已将这个(遗留的?)代码更改为使用 `isKindOfClass` 函数,但我仍然很困惑,不明白这里到底发生了什么。
相关代码:
#import <objc/runtime.h>

static const char *getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T') {
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "@";
}

到底发生了什么事情,为什么结果不同呢?
2个回答

3

getPropertyType返回的缓冲区没有以NULL结尾。我认为它之前能够工作只是纯属运气。此外,返回新创建的NSData所指向的数据不能保证在该函数返回后仍然有效。

我建议将其改为返回NSString。

NSString* getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T') {
            return [[NSString alloc] initWithBytes:attribute + 3 length:strlen(attribute) - 4 encoding:NSASCIIStringEncoding];
        }
    }
    return @"@";
}

假设启用了自动引用计数(ARC)。


2
你的方法的返回值不需要以NULL结尾,因为它指向一个NSData对象的内部存储器。这可能会解释你期望输出后面的随机字节。
还要注意的是,如果NSData对象被销毁(可能在函数返回后的任何时候),返回值可能根本不指向有效的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接