1

なぜ次の Objective-C コードは
name : (null)を出力します
が、NSLog(@"Country name : %@", c.name); 国名
: 米国
名 : 米国

 Country *c = row;
 //NSLog(@"Country name : %@", c.name);
 Ivar ivar = class_getInstanceVariable([row class], "name");
 NSString *name = object_getIvar(row, ivar);
 NSLog(@"name : %@", name);
4

3 に答える 3

1

おそらく、このプロパティnameは、自動生成された というインスタンス変数によってサポートされています_name。試す

Ivar ivar = class_getInstanceVariable([row class], "_name");

代わりは。

于 2013-01-29T10:07:52.490 に答える
0

ドキュメントには次のように記載されています。

インスタンス変数のIvarがすでにわかっている場合、object_getIvarはobject_getInstanceVariableよりも高速です。

これは、おそらくあなたのivarが「知られている」必要があることを意味します。これは、ログステートメントで取得された後に正しく印刷される理由を説明しています。と一緒に行きobject_getInstanceVariableます。

ドキュメントには次のことも記載されていることに注意してください。この低レベルのものに入るには、本当に正当な理由が必要です。

このリファレンスは、主にObjective-Cと他の言語間のブリッジレイヤーの開発、または低レベルのデバッグに役立ちます。通常、Objective-Cでプログラミングする場合、Objective-Cランタイムライブラリを直接使用する必要はありません。

于 2013-01-29T10:10:23.697 に答える
0

iVar の代わりにプロパティを使用することで、この問題を回避しています。次に、 と を使用して、プロパティを取得および設定できsetValue:forKey:ますvalueForKey:

Apple のドキュメントは次のとおりです。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

于 2013-01-31T07:35:43.017 に答える