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 propertyNameczy 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.someIntbę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 someIntplus _someIntzmienną generowaną automatycznie . W ten sposób self.someInti someIntnie 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.