Чем отличается self.xxx от прямого вызова xxx в Obj-C? - PullRequest
0 голосов
/ 29 декабря 2011

Например, у меня есть UIViewController, и у меня есть значение:

NSString *testString;

@property (nonatomic, retain) NSString *testString;

в .м:

@synthesize testString;

И чем отличаются эти две строки кода:

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

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

В первом случае новое значение присваивается testString, вы получаете доступ к testString напрямую:

testString = @"something";

Во втором случае:

self.testString = @"something";

Вы звоните setter, сгенерированному путем вызова @synthesize testString и фактом, что это свойство.

Во втором случае генерируются вызовы [aUIViewControllerObject setTestString: @"something"], в которых сохраняется @"something" NSString (поскольку свойство testString объявлено с параметром retain), старое значение равно autoreleased или released и новое значение присваивается testString.

0 голосов
/ 29 декабря 2011

в коде не-ARC есть существенная разница, если вы объявляете свойства как retain или copy. в этих двух случаях происходит нечто большее за кадром, когда вы звоните self.property. очень просто retain делает что-то вроде:

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

и с копией это будет что-то вроде:

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

}

0 голосов
/ 29 декабря 2011

self.testString = @"something"; неявно вызывает setTestString: метод.В вашем случае это означает следующее:

-(void) setTestString: (NSString*) newString
{
    if (testString != newString)
    {
        [testString release];
        testString = [newString retain];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...