5

似乎我们使用的应用程序getPropertyType(..)在 ios7 下失败了。无论出于何种原因,getPropertyType(..)例如一个 NSString 属性NSString$'\x19\x03\x86\x13作为类型返回,而不仅仅是 NSString,也不是 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 "@";
}

到底是怎么回事,为什么结果不一样??

4

2 回答 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。

于 2013-09-19T18:44:07.583 回答
2

方法的返回值不需要以 NULL 结尾,因为它指向NSData对象的内部存储器。这将在您的预期输出之后解释随机字节。

NSData另请注意,如果对象被销毁(可能在函数返回后的任何时间),返回值可能根本不指向有效内存。

于 2013-09-19T18:39:21.610 回答