以下代码将警告显示为
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; }
我应该更改哪个更改警告?请帮帮我。
答案 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.isa
与class = object_getClass(array)