2013-03-13 15 views
6

ARC projesinde çalışırken örnek değişkenlerle (arabirimde bildirilen), @property ve @synthesize ile çalışmanın uygun yolu nedir? Şimdi ne şudur:Örnek değişkenleri/özellik/sentezlemenin ARC ile kullanımı için doğru yolu

SomeClass.h:

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

ve SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

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

şey sadece kullanma gibi çalışır başka yaklaşımlar olmasıdır @ özelliği:

SomeClass.h:

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

someStringself olmadan:

SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

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

vb Objective-c yeniyim, Java alıştım. O zaman özelliklerle çalışmanın doğru yolu nedir? Özel durumların özel davranışları olacağını anlıyorum, ama genel olarak en iyi yaklaşım nedir? (Genel olarak, sınıfın kendisinden ve "dışardan" değişkene erişmek istiyorum ve ARC'nin doğru şekilde çalışmasını istiyorum. Örneğin, bellek sızıntıları hakkında endişelenmek istemiyorum)

+2

Sadece özellikleri tanımlayın. Ve Xcode 4.5+ kullanıyorsanız, sentezleme ifadesine bile ihtiyacınız yoktur. Bu uygun yol olarak kabul edilir, çünkü özellikler otomatik olarak iVars oluşturur. Bir iVar kullanmanız gerekiyorsa, Xcode 4.5+ sürümünde, eğer varsa, isminin isminden önce (_) otomatik olarak oluşturulmuşsa, "_" ifadesini kullanın, daha sonra aşağıdaki gibi oluşturun: @synthesize variable = _variable; – Petar

+0

@ pe60t0 Artık '@ synthesize' ifadesini kullanma gereksinimi Xcode 4.4 ile tanıtıldı. –

+0

Kötü, yorumunu şimdi düzenleyemiyorum. – Petar

cevap

9

basit özellikler için ise, örnek değişken beyanı veya @synthesize gerekmez. Clang derleyici, sizin için varsayılan olarak her ikisini de üretecektir. Yani başlığında bu yazabiliriz:

@interface SomeClass : NSObject 

@property (nonatomic, copy) NSString *someString; 

@end 

Ve uygulaması: Eğer -init yöntemiyle veya ayarlayıcı geçersiz kılma olmadıkça

@implementation SomeClass 

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

@end 

doğrudan örnek değişken erişimi kaçının. Başka her yerde nokta sözdizimini kullanmalısınız (self.someString). Örnek değişkenine erişmeniz gerekiyorsa, varsayılan sentez alt çizgi-önekli ivar, ör. _someString.NSString/NSMutableString ve NSArray/NSMutableArray gibi değişken sürümleri ile sınıfları için standart uygulama bir copy özelliğini kullanmak olduğunu

Not. Bir dize veya dizide strong kullanırsanız, arayan değiştirilebilen bir sürümden geçebilir ve sonra altından mutasyona uğrayarak, bulunması zor olan hatalara neden olabilir.

-2

this SO post için ARC hakkında bilgi.

(Düzenlendi) "Güçlü" öznitelik, ARC'ye nesnenin özelliği serbest bırakılana kadar nesne tutmasını söyler. Bir NSString özelliği bir NSMutableString olarak geçirilmiş olabileceğinden "copy" özelliğine ihtiyacınız var. "Kopya", orijinal nesnenin etrafında saklanacağını garanti eder. Yine, orijinal olarak burada bulunan yanlış/yanıltıcı bilgi için özür dilerim.

nedeni someString değişken hem deself.someString@synthesize someString hat özelliği için bir örnek değişkeni oluşturur ve alma ve bunun değerini ayarlamak için yöntemler oluşturur olmasıdır mülkiyet örneğini erişebilir. Ancak, örnek değişkenini doğrudan kullanmak yerine özelliği kullanmanız önerilir çünkü örnek değişkenini kullanarak, üst nesnenin özelliklerini değiştirdiğinizi bilmesine izin veremezsiniz.

+0

Xcode 4.4'ten beri, '@ synthesize' işlevini açıkça kullanmıyorsanız, örnek değişkeni dolaylı olarak altçizgi olan' _someString' olarak adlandırılacaktır. –

+1

Dizeleri ile 'strong' kullanma yanlış. Arayanın mutable alt sınıfında ("NSMutableString" veya "NSMutableArray") geçebileceği ve daha sonra başka bir noktaya geçirebileceği "NSString" veya "NSArray" gibi şeylerde 'copy'i kullanmak standart uygulamadır. –