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 NSObjectisaobject_getClass

于 2013-06-28T06:17:55.323 に答える