2010-04-29 25 views
22

Okunan bir özellik oluşturmaya çalışıyordum. Bu sınıfın bir örneğini oluşturan sınıfın bir değeriyle başlatmayı istedim, ör.Salt okunur bir özelliği kullanıma hazırlama

@property (retain,readonly) NSString *firstName;

Ve ben böyle başlatmak için çalıştı: Bunu yapan kez

-(id)initWithName:(NSString *)n{ self.firstName = n; }

, derleyici saltokunurluğun tahsis edilemez bir hata bildirdi. Peki bunu nasıl yapabilirim? Genellikle zaten herhangi init ve dealloc yöntemleri ayarlayıcıları atlamak için tavsiye edilir

firstName = [n retain]; //Or copy 

:

cevap

13

sentezlenmiş ayarlayıcı kullanmayın.

+0

Yukarıdaki uygulamamdaki sorun, değerin korunmamasıdır. Korumayı mülkiyete eklediğimde, bu ödev değeri mülke atayacaktır. Ve eğer başka bir nesne bu özelliğe erişirse, bu değer orada olacaktır. Sorumu değiştirdim – awsome

+0

Neden bu bir sorun olur? 'Firstname = [n hold] 'işlevinin kullanılması, sadece' n' için bir işaretçiyi gösterir. Evet, başka bir nesne bu özelliğe eriştiğinde, değer orada olacak. :) – Rengers

+0

Eğer bu özelliğe erişirsem bu şekilde yapmaya çalışırsam, şu istisnaları alıyorum.Program sinyal aldı: “EXC_BAD_ACCESS”. Ve bu hata başka herhangi bir özellikten dolayı değildir. Bunu hata ayıklayıcıda çok araştırdım. Bu özellik "kapsam dışı" gösterir. Ve eğer self.firstName = n; ile atarsam. o zaman her şey iyi çalışıyor. – awsome

38

doğrudan örnek değişkeni atamak Ya ya da özel bir sınıf uzantısı özelliği redeclare (İhtiyacınız olduğunda retain veya copy bir eklemeyi unutmayın).

senin .m dosyasında
@property (readonly, copy) NSString *firstName; 

: Bu gibi: senin .h dosyasında

@interface MyClass() 

// Redeclare property as readwrite 
@property (readwrite, copy) NSString *firstName; 

@end 


@implementation MyClass 

@synthesize firstName; 
... 

Artık uygulanmasında sentezlenen ayarlayıcı kullanın ancak sınıf arayüzü hala gösterir özellik olarak salt okunur. .h dosyanızı içe aktaran diğer sınıfların hala -[MyClass setFirstName:] numaralı telefonu arayabileceğini, ancak var olduğunu bilmeyeceklerini ve bir derleyici uyarısı alacağını unutmayın.

+0

Bu güzel bir çözüm gibi görünüyor. Teşekkürler. – awsome

+0

@Renger tarafından önerilen yaklaşıma göre sentezlenmiş ayarlayıcıyı kullanmanın bir avantajı var mı? – Madbreaks

2

doğrudan üzere tesisle erişebilirsiniz:

_firstName = n;

Eğer @property (retain,readonly) NSString *firstName; dolayısıyla derleyici hatası readonly belirtilen çünkü self.firstName = n sentez olmayacak ima ayarlayıcı yöntem.

+0

_firstName ... –

+0

yok, _firstName'in var olacağı benim anlayışım. Mülkiyet ilan edildiğinde oluşturulan temel ivardır. Xcode 4.6'dan itibaren derleyici bunu sizin için otomatik olarak oluşturmalıdır. – Bob9630

+0

Bu benim de @ Bob9630. Bu soruya verilen diğer cevaplar benim durumumda istenen sonucu vermedi, buna rağmen. –

İlgili konular