Ponieważ właśnie napotykam ten problem podczas edytowania starszego kodu, chcę zrobić dodatkowe notatki do istniejących odpowiedzi, o których należy wiedzieć.
Nawet w przypadku nowszej wersji kompilatora czasami ma znaczenie, czy pominiesz, @synthesize propertyName
czy nie .
W przypadku, gdy deklarujesz zmienną instancji bez podkreślenia, a jednocześnie ją syntetyzujesz, na przykład:
Nagłówek:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
Realizacja:
@implementation SomeClass
@synthesize someInt;
@end
self.someInt
będzie mieć dostęp do tej samej zmiennej co someInt
. Brak wiodącego podkreślenia dla ivars nie jest zgodny z konwencją nazewnictwa, ale po prostu znalazłem się w sytuacji, w której musiałem odczytać i zmodyfikować taki kod.
Ale jeśli teraz myślisz „Hej, @synthesize nie jest już ważne, ponieważ używamy nowszego kompilatora” , mylisz się! Twoja klasa będzie wtedy mieć dwa ivary , a mianowicie someInt
plus _someInt
zmienną generowaną automatycznie . W ten sposób self.someInt
i someInt
nie będzie już adresować tych samych zmiennych. Jeśli nie spodziewasz się takiego zachowania, jak ja, może to przyprawić Cię o ból głowy.