IOS 6和7不会返回相同的结果

似乎我们的应用程序使用getPropertyType(..)在ios7下失败。 不pipe什么原因, getPropertyType(..) on例如一个NSString属性返回NSString$'\x19\x03\x86\x13作为types,而不是NSString,而不是NSNumber它返回NSNumber\xf0\x90\xae\x04\xff\xff\xff\xff 。 所有这一切都造成了一些棘手的问题,当我后来检查一个特定的types。 我已经改变了这个(遗留下来的)代码来使用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 "@"; } 

究竟是怎么回事,结果为什么不同?

getPropertyType返回的缓冲区不是以NULL结尾的。 我认为这只是运气不好的运气。 而且,返回新创build的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。

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

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