isa是弃用问题

时间:2013-06-28 06:15:41

标签: iphone json ios6

以下代码将警告显示为

Direct access to objective-c's isa is deprecated in favor of object_setClass() and object_getClass()

代码

  if(object->isa == encodeState->fastClassLookup.stringClass)     
  { isClass = JKClassString;     }
  else if(object->isa == encodeState->fastClassLookup.numberClass)     
  { isClass = JKClassNumber;     }
  else if(object->isa == encodeState->fastClassLookup.dictionaryClass) 
  { isClass = JKClassDictionary; }
  else if(object->isa == encodeState->fastClassLookup.arrayClass)      
  { isClass = JKClassArray;      }
  else if(object->isa == encodeState->fastClassLookup.nullClass)       
  { isClass = JKClassNull;       }
  else 
  {
     if([object isKindOfClass:[NSString     class]]) 
  { encodeState->fastClassLookup.stringClass     = object->isa; isClass = JKClassString;                    }
  else if([object isKindOfClass:[NSNumber     class]]) { encodeState->fastClassLookup.numberClass     = object->isa; isClass = JKClassNumber;     }
  else if([object isKindOfClass:[NSDictionary class]]) { encodeState->fastClassLookup.dictionaryClass = object->isa; isClass = JKClassDictionary; }
  else if([object isKindOfClass:[NSArray      class]]) { encodeState->fastClassLookup.arrayClass      = object->isa; isClass = JKClassArray;      }
  else if([object isKindOfClass:[NSNull       class]]) { encodeState->fastClassLookup.nullClass       = object->isa; isClass = JKClassNull;       }

我应该更改哪个更改警告?请帮帮我。

2 个答案:

答案 0 :(得分:9)

任何对象上的isa字段是对该对象的类的引用;它是ObjC运行时内部机制的一部分,并且取消引用该对象指针以获取该字段的功能但很脆弱并打破了封装。

编译器在警告中告诉你,你可以使用object_getClass,这是ObjC运行时中的一个函数来检索相同的东西。

您显示的代码段是在每个-class上避免标准NSObject method,而是似乎抓住了isa这样做的目的是获得性能上的好处。这必须是一些令人难以置信的性能敏感代码才能保证,但如果是,则object_getClass看起来是not much slower

答案 1 :(得分:9)

包括<objc/runtime.h>

使用array->isa = _JKArrayClass;

替换object_setClass(array, _JKArrayClass)之类的所有内容

以及class = array.isaclass = object_getClass(array)

之类的所有内容

请参阅:iOS 7 : 'isa' is deprecated