Bildirilen özellikler karşılık gelen bir örnek değişkeni gerektirir mi?


101

Objective-C 2.0'daki özellikler, bildirilecek karşılık gelen bir örnek değişkenini gerektirir mi? Örneğin, böyle bir şey yapmaya alışkınım:

MyObject.h

@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

MyObject.m

@implementation
@synthesize name;
@end

Ancak, bunun yerine bunu yaparsam:

MyObject.h

@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end

Bu hala geçerli mi? Ve önceki örneğimden herhangi bir şekilde farklı mı?


Kalın yazılmış ikinci 'MyObject.h' neden 'MyObject.m' değil?
Ríomhaire

Yanıtlar:


93

Eğer (iOS 3.x veya daha veya 64 bit ya Snow Leopard veya daha o) o zaman do Modern Objective-C Runtime kullanıyorsanız değil böyle durumlarda Mülklerinizle ilgili ivars tanımlamanız gerekir.

Ne zaman sana @synthesizemülk, ivar yürürlükte sizin için de sentez edilecektir. Bu, "kırılgan-ivar" senaryosunu aşar. Cocoa with Love hakkında daha fazla bilgi edinebilirsiniz.


71

Arayüzünüzde, küme ayraçları arasında veya @propertyküme ayraçlarının dışında veya her ikisi aracılığıyla resmi olarak bir örnek değişkeni tanımlayabilirsiniz . Her iki durumda da sınıfın nitelikleri haline gelirler. Aradaki fark, eğer beyan @propertyederseniz, @synthesizesizin için alıcınızı / ayarlayıcınızı otomatik olarak kodlayan kullanarak uygulayabilirsiniz . Örneğin, otomatik kodlayıcı ayarlayıcı tam sayıları başlatır ve sıfıra atar. Bir örnek değişkeni bildirirseniz ve karşılık gelen bir değişken belirtmezseniz , kendi alıcı / ayarlayıcınızı @propertykullanamazsınız @synthesizeve yazmanız gerekir .

Otomatik kodlu alıcı / ayarlayıcıyı her zaman kendiniz belirleyerek geçersiz kılabilirsiniz. Bu genellikle managedObjectContexttembel olarak yüklenen mülk ile yapılır . Böylece, kendinizi managedObjectContextbir mülk olarak ilan edersiniz , ancak daha sonra bir -(NSManagedObjectContext *)managedObjectContextyöntem de yazarsınız . Bir örnek değişkeni / özelliği ile aynı ada sahip bir yöntemin "alıcı" yöntemi olduğunu hatırlayın.

@propertyBeyan yöntemi ayrıca aşağıdakiler gibi diğer seçenekler, izin verir retainve readonlyörnek değişken bildirim yöntemi değil. Temelde, ivareski yoldur ve @propertyonu genişletir ve daha süslü / daha kolay hale getirir. Kendini kullanarak her ikisine de başvurabilirsiniz. önek olsun veya olmasın, ad o sınıfa özgü olduğu sürece önemli değildir. Aksi takdirde, üst sınıfınız sizinle aynı özelliğe sahipse, o zaman hangi addan bahsettiğinizi belirtmek için self.name veya super.name gibi söylemeniz gerekir.

Böylelikle, ivardiş telleri arasında giderek daha az sayıda insanın s ilan ettiğini ve bunun yerine sadece belirlemeye @propertyve sonra yapmaya yöneldiğini göreceksiniz @synthesize. @synthesizeKarşılık gelmeden uygulamanızda yapamazsınız @property. Sentezleyici, yalnızca @propertyspesifikasyondan ne tür bir nitelik olduğunu bilir . Synthesize ifadesi ayrıca özellikleri yeniden adlandırmanıza olanak tanır, böylece kodunuzun içinde bir özelliğe tek adla (steno) başvurabilirsiniz, ancak .h dosyasının dışında tam adı kullanabilirsiniz. Ancak, XCode'un sahip olduğu gerçekten harika otomatik tamamlamayla, bu daha az bir avantaj, ancak yine de var.

Umarım bu, etrafta dolaşan tüm kafa karışıklığını ve yanlış bilgileri gidermeye yardımcı olur.


Artık bir gün @ synthesize yazmak zorunlu değil. Peki bu durumda bu cevap nasıl geçerli?
raaz

<code> @property ... @ synthesize </code> bildirmeniz GEREKMEZ. Sentezlemeyi kullanmak, uygulamanızda bir alıcı / ayarlayıcı yazmak zorunda kalmanızı sağlar. Sentezlemezseniz, kendi alıcı / ayarlayıcınızı
yuvarlamalısınız

2
@PapaSmurf Bu yanlış. Sen kullanabilirsiniz @propertyve olmayan kullanmak @synthesizeonları kendin uygulamak değil. Derleyici, synthesizeartık yazmak zorunda kalmadan sizin için otomatik olarak çalışacaktır .
jbrennan

8

her iki şekilde de çalışır, ancak bunları küme parantezlerinde bildirmezseniz, xcode'daki hata ayıklayıcıdaki değerlerini görmezsiniz.


3

Belgelerden:

Genel olarak, özelliklerin davranışı hem modern hem de eski çalışma zamanlarında aynıdır (Objective-C Çalışma Zamanı Programlama Kılavuzundaki "Çalışma Zamanı Sürümleri ve Platformları" konusuna bakın). Bir temel fark vardır: Modern çalışma zamanı örnek değişken sentezini desteklerken eski çalışma zamanı desteklemez.

@Synthesize öğesinin eski çalışma zamanında çalışması için, aynı ada ve özellik uyumlu türüne sahip bir örnek değişkeni sağlamanız veya @synthesize deyiminde başka bir mevcut örnek değişkeni belirtmeniz gerekir. Modern çalışma zamanında, bir örnek değişkeni sağlamazsanız, derleyici sizin için bir tane ekler.


3

XCode 4.4 veya sonraki bir sürümünü kullanıyorsanız, sizin için örnek değişken sentezleme kodu oluşturacaktır.

Sadece aşağıdaki gibi özellikleri beyan etmeniz gerekiyor; sizin için sentezleme kodu ve örnek değişken bildiren kod üretecektir.

@property (nonatomic, strong) NSString *name;

olarak sentezleme kodu üretecek

@synthesize name = _name;

ve _name kullanarak örnek değişkenine erişebilirsiniz, bu, bildirime benzer

NSString* _name

ancak salt okunur özelliği beyan ederseniz,

@property (nonatomic, strong, readonly) NSString *name;

kod üretecek

@synthesize name;

veya

@synthesize name = name; 

Dolayısıyla, kendi sentezleme kodunuzu yazabileceğiniz herhangi bir şekilde "_" öneki olmadan anlık değişken adına erişmelisiniz, sonra derleyici sizin için kod üretecektir. Yazabilirsin

@synthesize name = _name;

1

Objective-C Programlama Dili: Özellik Uygulama Direktifleri

Erişimci sentezinin davranışında, çalışma zamanına bağlı olarak farklılıklar vardır (ayrıca bkz. "Çalışma Zamanı Farkı"):

  • Eski çalışma zamanları için, örnek değişkenleri mevcut sınıfın @interface bloğunda önceden bildirilmiş olmalıdır. Özellikle aynı adda bir örnek değişkeni varsa ve türü özelliğin türüyle uyumluysa kullanılır, aksi takdirde derleyici hatası alırsınız.

  • Modern çalışma zamanları için (Objective-C Çalışma Zamanı Programlama Kılavuzundaki "Çalışma Zamanı Sürümleri ve Platformları" na bakın), örnek değişkenleri gerektiği gibi sentezlenir. Aynı isimde bir örnek değişkeni zaten mevcutsa, kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.