Objective-Cの合成プロパティ名をオーバー
-
25-09-2019 - |
質問
思わりを理解することを目指してい目的に synthesize
指令とのプロパティ名をオーバー.いというんのインタフェースを定義しました。
@interface Dummy ... {
UILabel *_dummyLabel;
}
@property (retain, nonatomic) UILabel *dummyLabel;
の実行ファイルにしてい:
@synthesize dummyLabel = _dummyLabel;
だからこそ理解"dummyLabelするようになってきたエイリアスのインスタンス変数"_dummyLabel".違いがあります。_dummyLabelとします。dummyLabel?
解決
はい。 self._dummyLabel
が定義されていない、しかし_dummyLabel
ではありません。
ドットシンタックスは、簡単なメソッド呼び出しに出て展開します。あなたが-(id)someObject
の場合には、たとえば、object.someObject
というメソッドを持っている場合は、[object someObject];
を書いたかのように、それはなります。
self.dummyLabel //works
self._dummyLabel //does not work
dummyLabel //does not work
_dummyLabel //works
[self dummyLabel]; //works
[self _dummyLabel]; //does not work
他のヒント
ご理解が間違っています。 dummyLabel
はプロパティの名前、 ない エイリアスのインスタンス変数のインスタンス変数は のみ という _dummyLabel
.そのため、以下の保のためのインスタンス Dummy
という myObject
:
[myObject dummyLabel]
作品myObject.dummyLabel
作品[myObject _dummyLabel]
失敗したmyObject._dummyLabel
失敗したmyObject->dummyLabel
失敗したmyObject->_dummyLabel
により、視認性のivar(@public
,@private
,@protected
)[myObject valueForKey: @"dummyLabel"]
作品[myObject valueForKey: @"_dummyLabel"]
により実施+accessInstanceVariablesDirectly
(では、デフォルトの場合+accessInstanceVariablesDirectly
を返しますYES
).
別の名前を持つことの利点 プロパティがあるためよりIVARのための あなたは簡単にコード内で見ることができます あなたは、一つまたはアクセスしているとき 他の - アンドレ・K
私、私は「答え」として投稿する抱えているので、「コメント」ボタンを見つけることができませんよ。
変数が保持されているときに/コピー/自動的に解除あなたの素敵なセッターのおかげであなたはバニラ変数対合成されたプロパティを使用している際に知ることによって、あなたは(特にセッターの場合には)知っている -だけは、アンドレさんのコメントに拡大したいです、手で操作される対。
はもちろん、あなたが正しいことをやっている場合、あなたはおそらく保持するために、セッターの助けを必要としない/リリースが適切にオブジェクトを!しかしself.ivar
の代わり_ivar
としてあなたアイバーズを参照すると、このようなカスタムのセッター/ゲッターの代わりに、デフォルトの合成されたものを使用している場合など、参考にすることができ、あまりにも他のシナリオが存在することができます。おそらく、あなたは、プロパティを変更するたびに、あなたもNSUserDefaultsにそれを保存したいです。あなたはこのようないくつかのコードを持っているかもしれませんのでます:
@interface SOUserSettings : NSObject {
BOOL _autoLoginOn;
}
@property (nonatomic, assign) BOOL autoLoginOn;
@end
@implementation SOUserSettings
@synthesize autoLoginOn = _autoLoginOn;
- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {
_autoLoginOn = newAutoLoginOnValue;
[[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}
@end
注:これは単なる説明のコードで、そこで千物事を間違っている可能性
あなたは_autoLoginOn = YES
を言うラインを持っている場合だから今、あなたのコードでは、 - あなたはNSUserDefaultsに保存するつもりはない知っている、あなたはself.autoLoginOn = YES
を使用する場合は起こるために起こって正確に何を知っているのに対し、
_autoLoginOn
とself.autoLoginOn
の違いは単なるセマンティックよります。
一部にObjCで私は、任意の大きな利点が表示されません 名前変更_dummyLabelにdummyLabel
は、あなたが苦労クラスのユーザーには見えないインスタンス変数を作成していランタイム。彼らはあなたのインスタンス変数にいくつかの接頭辞(または接尾辞)を貼り付けるためには、あなたは誰があなたの変数をいじりたくないということを明確にする(またはそれ以上クリア)することができます。しかし、あなたは、公共の機能上のネバネバしたものを望んでいません。これは、あなたがそれを取得することができます。
あなたは(setLastname対setSurname)名前の新しいセットに新しいAPIのセットと同時に名前の1セットで古いインターフェースを維持する必要がある場合にも有用である可能性があります。
古いポストが、私はそれが(ドット表記で、そう)ゲッターとセッターを経由してアクセス変数に推奨されていることを、言及するのは重要だと思います。それを初期化するとき、直接フィールドへのアクセス(_ivar)強くのみお勧めします。
いくつかの良いAppleの記事があります: https://developer.apple.com/ライブラリ/ IOS /#ドキュメント/ココア/概念/ ProgrammingWithObjectiveC / EncapsulatingData / EncapsulatingData.htmlする
最後の段落ます:
あなたは常に内から直接インスタンス変数にアクセスする必要があります 初期化メソッド時にプロパティが設定されているため、 オブジェクトの残りの部分は、まだ完全に初期化されないことがあります。たとえあなたが カスタムアクセサメソッドを提供したり、から任意の副作用を知りません 独自のクラスの中に、将来サブクラスは非常によく無効にすることができます 行動ます。