質問

思わりを理解することを目指してい目的に 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を使用する場合は起こるために起こって正確に何を知っているのに対し、

_autoLoginOnself.autoLoginOnの違いは単なるセマンティックよります。

  

私は、任意の大きな利点が表示されません   名前変更_dummyLabelにdummyLabel

一部にObjCで

は、あなたが苦労クラスのユーザーには見えないインスタンス変数を作成していランタイム。彼らはあなたのインスタンス変数にいくつかの接頭辞(または接尾辞)を貼り付けるためには、あなたは誰があなたの変数をいじりたくないということを明確にする(またはそれ以上クリア)することができます。しかし、あなたは、公共の機能上のネバネバしたものを望んでいません。これは、あなたがそれを取得することができます。

あなたは(setLastname対setSurname)名前の新しいセットに新しいAPIのセットと同時に名前の1セットで古いインターフェースを維持する必要がある場合にも有用である可能性があります。

古いポストが、私はそれが(ドット表記で、そう)ゲッターとセッターを経由してアクセス変数に推奨されていることを、言及するのは重要だと思います。それを初期化するとき、直接フィールドへのアクセス(_ivar)強くのみお勧めします。

いくつかの良いAppleの記事があります: https://developer.apple.com/ライブラリ/ IOS /#ドキュメント/ココア/概念/ ProgrammingWithObjectiveC / EncapsulatingData / EncapsulatingData.htmlする

最後の段落ます:

  

あなたは常に内から直接インスタンス変数にアクセスする必要があります   初期化メソッド時にプロパティが設定されているため、   オブジェクトの残りの部分は、まだ完全に初期化されないことがあります。たとえあなたが   カスタムアクセサメソッドを提供したり、から任意の副作用を知りません   独自のクラスの中に、将来サブクラスは非常によく無効にすることができます   行動ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top