3

以下代码将警告指示为

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;       }

我应该做什么改变来清除那个警告?请帮帮我。

4

2 回答 2

9

包括<objc/runtime.h>.

将所有内容替换array->isa = _JKArrayClass;object_setClass(array, _JKArrayClass)

一切都class = array.isa喜欢class = object_getClass(array)

请参阅:iOS 7:不推荐使用“isa”

于 2013-11-09T11:25:24.723 回答
9

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

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

您展示的代码片段是避免使用每个标准-class 方法NSObject,而是似乎是isa为了从中获得性能优势。这必须是一些对性能非常敏感的代码才能保证这一点,但如果是这样,那么object_getClass看起来不会慢很多

于 2013-06-28T06:17:55.323 回答