2013-03-13 12 views
6

Jaki jest właściwy sposób pracy ze zmiennymi instancji (zadeklarowanymi na interfejsie), ich @property i @synthesize, podczas pracy w projekcie ARC? Co mam teraz zrobić, jest następujący:Właściwy sposób użycia zmiennych instancji/właściwości/synthetize z ARC

SomeClass.h:

@interface SomeClass : NSObject { 
    NSString *someString; 
} 
@property(nonatomic, copy) NSString* someString; 

i SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

Chodzi o to, że istnieją inne metody, które działa podobnie jak przy użyciu tylko @ Obiekt:

SomeClass.h:

@interface SomeClass : NSObject 
@property(nonatomic, copy) NSString* someString; 

Uzyskiwanie dostępu do someString bez self:

SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    someString = @"Foobar"; 
} 

itd. Jestem nowy w Objective-C, jestem przyzwyczajony do Javy. Jaki jest zatem właściwy sposób pracy z atrybutami? Rozumiem, że szczególne przypadki będą miały szczególne zachowanie, ale jakie jest najlepsze podejście w ogóle? (ogólnie mam na myśli, że chcę uzyskać dostęp do zmiennej z samej klasy i "z zewnątrz" i chcę, aby ARC nadal działał poprawnie, np. nie muszę się martwić o wycieki pamięci)

+2

Wystarczy zdefiniować właściwości. A jeśli używasz Xcode 4.5+, nie potrzebujesz nawet instrukcji syntezatora. Jest to uważane za właściwy sposób, ponieważ właściwości automatycznie utworzą iVars. Jeśli potrzebujesz użyć iVar, to jeśli w Xcode 4.5+, użyj "_" przed nazwą właściwości (ponieważ są one tworzone automatycznie), jeśli nie, stwórz je tak: @synthesize variable = _variable; – Petar

+0

@ pe60t0 Konieczność rezygnacji z używania wyrażenia @ synthesize została wprowadzona za pomocą Xcode 4.4. –

+0

Mój zły, nie mogę teraz edytować komentarza. – Petar

Odpowiedz

9

W przypadku prostych właściwości nie jest wymagana deklaracja zmiennej instancji lub @synthesize. Kompilator clang wygeneruje domyślnie dla ciebie. Więc można napisać to w nagłówku:

@interface SomeClass : NSObject 

@property (nonatomic, copy) NSString *someString; 

@end 

i wdrożenie:

@implementation SomeClass 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

@end 

Unikaj bezpośredni dostęp do zmiennych instancji, chyba że jesteś w metodzie -init lub przesłanianie setter. Gdziekolwiek indziej powinieneś użyć składni kropkowej (self.someString). Jeśli potrzebujesz dostępu do zmiennej instancji, domyślna synteza spowoduje utworzenie podkreślonego przedrostka ivar, np. _someString.

Zauważ, że na zajęcia z modyfikowalnych wersjach jak NSString/NSMutableString i NSArray/NSMutableArray standardową praktyką jest wykorzystanie właściwości copy. Jeśli użyjesz strong na łańcuchu lub macierzy, dzwoniący może przekazać zmienną wersję, a następnie zmutować ją pod tobą, powodując trudne do znalezienia błędy.

-2

Zapoznaj się z this SO post dla informacje o ARC.

(Edytowany) Atrybut "silny" nakazuje ARC utrzymywanie obiektu dookoła, dopóki obiekt z właściwością nie zostanie zwolniony. Potrzebujesz "kopii", ponieważ właściwość NSString mogła zostać przekazana jako NSMutableString. "Kopia" gwarantuje zachowanie oryginalnego obiektu. Ponownie przepraszam za niepoprawne/wprowadzające w błąd informacje, które pierwotnie miałem tutaj.

Powodem można uzyskać dostęp do instancji zmiennąsomeString jak własność self.someString jest to, że linia @synthesize someString tworzy zmienną instancji dla właściwości i tworzy metody pobierania i ustawiania wartości niego. Zaleca się jednak korzystanie z właściwości zamiast bezpośredniego używania zmiennej instancji, ponieważ przy użyciu zmiennej instancji nie można poinformować obiektu nadrzędnego, że zmieniono jedną z jego właściwości.

+0

Zauważ, że ponieważ Xcode 4.4, jeśli nie używasz jawnie '@ synthesize', to zmienna instancji będzie domyślnie nazywana' _someString' z wiodącym podkreśleniem. –

+1

Używanie 'strong' z ciągami jest błędne. Standardową praktyką jest używanie 'copy' na takich rzeczach jak' NSString' lub 'NSArray', w których osoba dzwoniąca może przekazać podmodalną zmienną (' NSMutableString' lub 'NSMutableArray'), a następnie zmutować ją w późniejszym czasie. –

Powiązane problemy