あなた(そして答えた他の人のようです)は、プロパティと実際の変数を混同しています。
プロパティが機能する方法は、ivar を設定または取得/返すメソッド (setter および getter と呼ばれる) を作成することです。そして do 記法 (self.string) は実際にこれらのメソッドを呼び出します。したがって、プロパティを変更することはできません。宣言された iVar のみが変更されます。
次のようにプロパティを宣言すると:
@property (nonatomic, retain) NSString *string;
@synthesize すると、次のことが起こります。
string という名前の iVar (タイプ NString*) が作成されます
(もしあなたがそうするなら
@synthesize string = whateverYouWant
作成された iVar は、whateverYouWant と呼ばれます - 規則では、前にアンダースコア (_string) を付けたプロパティと同じ名前を iVar に付けます)
アクセサーメソッドはこのように作成されます
-(NSString*) string;
セッターはこのように作成されます
-(void) setString: (NSString*) newString;
ここで、self.xxxx が行うことは、実際にメッセージ xxxx を自分自身に送信することです ([self xxxx] のように)。プロパティでのみ使用する必要がありますが、プロパティだけでなく、任意のメソッドで機能します。
したがって、 self.string = @"hello" を実行すると、実際には次のようになります
[self setString: @"hello"];
(コンパイラは実際に設定しようとしていることを認識しているため、単なる文字列ではなく setString メッセージが送信されることに注意してください。self.string にアクセスすると、[self string] が送信されます)
したがって、プロパティを設定するのではなく、それ自体で iVar を設定する (合成された) セッター メソッドを呼び出します。
何をしているのか分かっていれば、iVar に直接アクセスしても問題ありません。通話中
string = @"something else";
メモリ管理が行われないため、リーク コードが生成されます。プロパティ (retain、copy、assign) の定義方法に応じて、合成されたアクセサーとセッターが実際にこれを行います。
(保持されたプロパティの)セッターは単に行うわけではないため
IVar = newValue
保持されたプロパティを宣言した場合、実際には次のようになります。
-(void) setString: (NSString*) newString {
if (string) [string release];
string = [newString retain];
}
そのため、プロパティの合成には少し手間がかかります。
編集
まだはっきりしていないように見えるので、宣言されたプロパティは変数のように考えるべきではありません。上記の例では、
@synthesize string = _string;
「文字列」と呼ばれる変数はありません。これは、setter メソッドを介して iVar _string を設定するメソッド構造にアクセスする方法です。string は変数/オブジェクト ポインターではないため、メッセージを送信することはできません ([string doSomething] は機能しません)。@synthesize 文字列を使用してプロパティを合成するだけの場合。生成された iVar はプロパティと同じ名前になります。[string doSomething] の呼び出しは機能しますが、プロパティとは関係ありません。「文字列」は iVar を指します。したがって、iVar にアンダースコアを付けた名前を付ける規則により、getter/setter を使用するつもりだったときに誤って iVar にアクセスすることはありません。