2011-12-29 18 views
0

例えば、私がのUIViewControllerを有し、その値があります.MでObj-Cのself.xxxとcalling xxxの違いは何ですか?

NSString *testString; 

@property (nonatomic, retain) NSString *testString; 

@synthesize testString; 

そして、何次の2行のコードの間で異なっている:

testString = @"something"; 
self.testString = @"something"; 
+3

:それはのようなものになるだろう

- (void)setFoo:(NSString *)newFoo { [newFoo retain]; [foo release]; foo = newFoo; } 

としてコピーNSString型のインスタンス。 – Kjuly

答えて

1

最初のケースはtestStringに新しい値を代入し、あなたは直接testStringにアクセスしている。第2のケースで

testString = @"something"; 

self.testString = @"something"; 

あなたがいます@synthesize testStringを呼び出して生成したsetterとそれがプロパティであるという事実。

第二ケースコールは(testStringプロパティはretainパラメータで宣言されているため)@"something"NSStringが保持される[aUIViewControllerObject setTestString: @"something"]を生成し、古い値がautoreleased又はreleasedであり、新しい値がtestStringに割り当てられます。

0

self.testString = @"something";は暗黙のうちにsetTestString:メソッドを呼び出します。あなたのケースでは、それは以下の意味:

-(void) setTestString: (NSString*) newString 
{ 
    if (testString != newString) 
    { 
     [testString release]; 
     testString = [newString retain]; 
    } 
} 
0

非ARCコードの場合、プロパティをretainまたはcopyと宣言している場合、大きな違いがあります。この2つのケースでは、self.propertyと呼ぶと、舞台裏でもう少し進んでいます。非常に単純化し、retainのようなものがない:

あなたがよりよい `代わりのための` retain`のcopy`を使用したい
- (void)setFoo:(NSString *)newFoo { 
    NSString *oldFoo = foo; 
    foo = [newFoo copy]; 
    [oldFoo release]; 
} 

}

関連する問題