1

この件に関する多くの投稿を読みましたが、すべてを完全に理解することはできません。わかりました、それは明らかです

self.text = @"MyText" will call the accessory method setText (autogenerated)

_text = @"MyText" will still assign the value but will not call the setText

これは明らかです。

しかし、これは、setText がメモリ管理を行うため、ARC を使用していない場合に便利です。しかし、ARC を使用するとどうなるでしょうか。_text を使用している場合はすべて正常に動作する場合もあれば、「self.text」を使用しないとアプリケーションが動作しない場合もあります。

では、本当の違いは何ですか?メモリ管理以上の何かが必要です。

私がこれを持っているとしましょう

@interface MyClass:NSObject { 
  NSMutableString *text; 
}

@property (nonatomic ) NSMutableString *text;

この場合、それは同じ呼び出しではありません

self.text = @"ok" 

また

text = @"ok" ?

違いは何ですか?

4

6 に答える 6

7

そのプロパティの基になるインスタンス変数は、実際には _text です。これが自動合成プロパティの仕組みです。

ただし、アクセサーを使用してプロパティを設定することを検討する必要があります (代わりに self. text = を使用します)。目標 c で ivar とプロパティを使用する理由の詳細については、このリンクを参照してください。

于 2013-09-05T08:53:21.770 に答える
4

self.text[self text](または[self setText:...]、割り当ての左側にある場合) の構文糖衣であり、メッセージです。自動生成 (「合成」) されると、接続されたインスタンス変数の値が返されます。_textこのインスタンス変数です。

クラス内のインスタンス変数にのみアクセスできます。どこからでもメッセージを送信できます。この区別は、ローカル変数の値を単純に返さないようにテキスト属性の内部動作を変更したい場合に重要です。

于 2013-09-05T08:48:39.403 に答える
4

答えはここにあります 本当に変数とプロパティが同時に必要ですか?

@property を使用すると、インスタンス変数だけでなく、アクセスおよび変更するためのメソッドも実際に作成されます。

@property (nonatomic, strong) NSString *text; がある場合 iVar _text と 2 つのメソッドを作成します。

self.text; //will call -(NSString *)text;
self.text = @"text here"; //is calling -(void)setText:(NSString *)text;

@property は定型コードを削除するために使用され、クラスを記述するために必要なコードの行数を減らします。

確かに、時々 self.text = @"ok" と _text = @"ok" を呼び出すことは、最近の ARC 環境では問題ありませんが、 -(NSString *)text; を取得できません。および -(void)setText:(NSString *)text; あなたの公開ヘッダーファイルに。

また、テキストの実装をオーバーライドした可能性があるため、 self.text および self.text = またはそれらの同等物 [self text] [self setText:] を呼び出すことをお勧めします。

-(NSString *)text{
    return [NSString stringWithFormat@"%@.jpg", _text];
}

-(void)setText:(NSString *)text{
    _text = [NSString stringWithFormat:@"DW%@", text];
}

したがって、これを行うと:

self.text = @"HelloThere";
NSLog (@"%@", self.text); //This will return DWHelloThere.jpg
NSLog (@"%@", _text); //Will return DWHelloThere
//whereas
_text = @"HelloThere";
NSLog (@"%@", _text); //Will return HelloThere

したがって、@property を使用すると、約 8 行のコードを節約でき、独自のクラスを整理整頓でき、必要に応じてアクセサーとミューテーターをオーバーライドできます。ただし、後者の点のため、iVar 自体にアクセスするだけでなく、self.text および self.text = @"so and so" を呼び出すことをお勧めします。

于 2013-09-05T08:51:35.183 に答える
2

概念的には、一方のケースではメッセージがオブジェクトに送信されるか、もう一方のケースでは単一の ivar が変更されるという違いのみです。メモリ管理の話は、ARC を使用する場合に処理される、必要なハウスキーピングにすぎません。

道徳的な話に興味がある場合は、Jon Reid の投稿を読んでください: Objective-C のドット表記法: 100% Pure Evil http://qualitycoding.org/dot-notation/

補足: できる限り ARC を使用してください。ほとんどの場合、retain-release サイクルは自動的に正しく処理されます (ただし、ブロック内の self へのアクセスは注意して処理する必要があります)。ARC を使用する場合、2 つの方法に違いはなく、保持カウントは正しく処理されます。そして、あなたが説明したように、ARCなしでは、プロパティの設定後にオブジェクトを解放する必要があることを確認する必要がありますが、ivarにアクセスするときはこれは必要ありません。いくつかのプラクティスの詳細については、この記事で説明しています: Objective-C のプロパティとメモリ管理 http://www.whilethis.com/2011/04/properties-and-memory-management-in-objective-c/

于 2013-09-05T09:04:35.670 に答える
1

本当の違いは次のとおりです。

コードでインスタンスを作成すると、テキストという変数があります。代わりにテキストでプロパティを使用すると、_text という iVar が作成されます。

ご想像のとおり、どちらを呼び出すかは、2 つのまったく異なる変数であるため、大きな違いになります。

于 2013-09-05T09:05:51.083 に答える
1

self.text = @"Something"_textアクセサ メソッドを使用してプライベート変数にアクセスします[self setText:@"Something"]。ドット表記は単なる構文糖衣です。このメソッドは、プライベート変数の値を設定するだけで機能を追加する独自の実装を持つことができます_text

_text = @"Something"値をプライベート変数自体に直接設定します。

また、textクラスの実装外でプロパティの値を設定すると、アクセサー[instance setText:@"Something"]が自動的に呼び出され、プライベート変数の値が設定されます。


違いが何であるかを簡単な例で示しましょう。メソッドの実装は教育目的のためだけに単純であるため、実際のコードでは意味をなさない場合があります:-)

textプロパティの値が変更されるたびにコンソールにメッセージを記録したいとします。- (void)setText:(NSString *)textたとえば、次のようにアクセサ メソッドをオーバーライドすることで、これを実現できます。

- (void)setText:(NSString *)text
{
    //  You can do whatever you want with the input "text" value, validate the value for example
    //  Here we just log the text was changed
    //  In the log message, we still have the old value of the "text" in the private variable "_text"
    //  so we can log it together with the new value
    NSLog(@"Value of \"text\" property changed from \"%@\" to \"%@\"", _text, text);

    //  Set the new value of the private variable
    _text = text;

    //  From here on, the private variable already has new value and the log line above
    //  would give the same values between from and to quotes
    NSLog(@"Value of \"text\" property is now \"%@\"", _text);
}

したがって、_text直接設定すると、変数に直接アクセスするため、上記のログ メッセージは実行されません。

一方、アクセサ メソッドを使用して設定するself.text = @"Something"と、次のようにコンソールに出力されます。

Value of "text" property changed from "(null)" to "Something"
Value of "text" property is now "Something"
于 2013-09-05T09:10:39.257 に答える