isa是弃用问题

Glo*_*chn 3 iphone json ios6

以下代码表示警告为

Direct access to objective-c's isa is deprecated in favor of object_setClass() and object_getClass()
Run Code Online (Sandbox Code Playgroud)

  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;       }
Run Code Online (Sandbox Code Playgroud)

我应该改变哪种警告?请帮帮我.

Ben*_*tto 9

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

编译器会在警告中告诉您可以使用object_getClass,这是ObjC运行时中的一个函数,用于检索相同的内容.

代码片段显示您是避免标准-class 方法上的每个NSObject而看上去要抓住isa从这样得到一个性能优势的意图.这必须是一些令人难以置信的性能敏感的代码,以保证,但如果是,那么object_getClass看起来并没有太慢.


Div*_*iya 9

包括<objc/runtime.h>.

更换一切都像array->isa = _JKArrayClass;object_setClass(array, _JKArrayClass)

所有的一切都像class = array.isaclass = object_getClass(array)

请参阅:iOS 7:'isa'已弃用