2011-04-13 17 views
18

Bir süper sınıfın özelliğini geçersiz kılabileceğiniz birkaç durum vardır.Objective-C'deki özellik geçersiz kılma nedenleri nelerdir?

  1. Aynı adı ve superclass' aynı özelliği olan bir mal beyanında. (Eğer bir derleyici uyarı alabilirsiniz niteliğinde değişiklik olursa beri) .Ve bir Ivar ile synthesieze ki sen yarat. 'un kullanımı nedir? Ya da zarar nedir?

  2. bir üst sınıf bir sınıf uzantısı (isimsiz bir kategori ) bir özelliğini açıklayan, o zaman başlık dosyasında olmayabilir. dosyasını numaralı dosyadan bilmiyorsanız, özelliğine aynı adı veya sınıfını istediğinizle bildirebilirsiniz. Ancak setter/getter yöntemi, bu "gizli özellik" için olanları geçersiz kılar. Bence bu sadece zarar verebilir. Ama başlığından dosyasından bilmiyorsunuz, bundan nasıl kurtulabilirsiniz?

  3. Sen "salt okunur" olarak başlık dosyasında bir mal beyanında ve sınıf uzantısında olabilir "ReadWrite" olarak redeclare. Bence bu iyi yapabilir durumdur.

Bu durumlar hakkında benim anlayışım doğru mu? Ve ilk ve ikinci durumların neler yapabileceğini bilmiyorum. Ama eğer ilk durumdan kaçınmak istersem, bunu ilan etmeden önce alt sınıfın mülkiyete sahip olup olmadığını kontrol edebilirim. Ama eğer mülk kamu başlık dosyasında değilse, ikinci durumda olduğu gibi, ne yapacağımı bilmiyorum.

cevap

5

vahşi kullanım sıklığını göz değişen, Bahsettiğiniz durumların her biri için uygun bir yer yoktur. Kendine basmamaya dikkat etmelisin. Örnekle, şahsen rastladığım örnekleri göstereceğim.

Subclassing kasıtlı Joe sözü gibi, size bir mülk geçersiz önce daha iyi yaptığınızı tam olarak ne olduğunu ve başka seçenekleri olmadığı vardı, bu durumda bir özellik
geçersiz kılmak için. Şahsen, mülkiyeti yeniden beyan etmek ve sentezlemek yerine, özelleştirme elde etmek için zaten var olan bir mülk için tek bir belirleyiciyi veya alıcıyı geçersiz kılmanın genellikle yeterli olduğunu buldum. Örneğin, yalnızca UIClearColor arka planına sahip olmak için mantıklı olan özel bir UIView alt sınıfını düşünün. Bunu uygulamak için, bir uyarı iletisi yazdırmak ve daha sonra üst aracın uygulamasını çağırmamak için -setBackgroundColor:'u geçersiz kılabilirsiniz. Bir mülkün tamamen geçersiz kılınması için bir nedenim olmadığımı söyleyeceğim, ancak mevcut bir mülkü tamamen ele geçirmeniz gereken bazı durumlarda kullanışlı bir araç olmadığını söyleyemeyeceğim.

Özel Mülkiyet
Bu için kredi vermek daha faydalıdır. Özel bir mülke alternatif, hepimizin aşina olduğu düz bir 'ivar'dır.

[_myIvar release], _myIvar = nil; 

ya: bu belirli bir sıklıkta değişiyor bir ivar ise, aşağıdaki görüldüğü gibi kod parçalarıyla bitireceğiz çok kötü görünmüyor ise

[_myIvar release]; 
_myIvar = [someValue retain]; 

, Bu gibi bellek yönetimi boilerplate kodu gerçekten eski, gerçekten hızlı olur. Alternatif olarak, yukarıdaki örneği özel bir varlık olarak, anlambilimini koruyabiliriz. bir süre sonra gözleri ve parmaklar çok daha kolaydır

self.myIvar = someValue; 

: Bu, sadece gereken şey olursa olsun, anlamına gelmektedir. Buna dikkat etmekte haklısınız, çünkü bu özellik evrenin geri kalanı için görünmez olduğundan, bir alt sınıf tarafından yanlışlıkla geçersiz kılınabilir. Bu, Objective-C'de geliştirirken doğal bir risktir, ancak riski ufukta küçültmek için önlemler alabilirsiniz. Bu önlemler, özel mülkünüzün ismini tahmin edilebilir bir şekilde değiştirmeye yönelik varyasyonlardır. Burada alabileceğin sonsuz yollar var: Örneğin, özel mülk isimlerini baş harfleri ve alt çizgi ile başlatacak kişisel bir politika yapıyorsun. Benim için mw_ivar ve ilgili -setMW_ivar: ve -mw_ivar erişim sağlayıcıları gibi bir şey alırdım. Evet, birisinin gelebileceği ve yanlışlıkla bu ismi geçersiz kılabileceği istatistiksel olarak mümkün, ama gerçekten yapmayacaklar. Özellikle de uygulamalarınızı kodunuzu kullanabilecek kişilere yayınlamanın bir yolu varsa. Ve Apple'ın etrafta dolanmadığını ve bu şekilde karışan özel mülkler yaptığını rahatlıkla söyleyebilirim, o yüzden bu cephede de güvende olacaksınız.

Halka Readonly,
Özel olarak okuma yazma Bu sadece standart bir uygulamadır. Haklısın, çünkü mülkiyetin içinde olduğu için tehlikeli değil. Yanlışlıkla geçersiz kılan herkesin sadece kendileri sorumludur.

+0

Aksi halde kaçırdığınız başka bir kullanım notu, bir alt sınıfta daha spesifik bir tür belirtmek içindir. YaniEbeveyninizde "id" tipi var. Alt sınıfta, bunu daha ayrıntılı olarak (NSString * 'gibi) özelliği yeniden sınıflandırarak ve alt öğede saklamayı kullanmak için derleyiciyi bilgilendirmek üzere alt sınıftaki' @ dynamic attribName 'öğesini kullanarak yapabilirsiniz. –

0

İyi soru

  1. geliştirici bu noktada yapıyor ve taban sınıfı mülke özelleştirme eklemek için gerekenleri bilmeli olarak bu kullanımı sensin. 'un ne yaptığını bildiğinize göre, numaralı telefonu super numaralı telefondan düzgün bir şekilde arayacaksınız. numaralı kararın super arayamaması, özellikle durumunun zararlı olduğu durumlarda, sınıfının nasıl uygulandığını bilmediğiniz durumlar olabilir.

  2. Evet bu zararlı ama üzerinde kategori kullanarak ve dikkatli özelliklerin veya yöntemlerin bir isim seçerek ve onları prefixing düşünmüyoruz önlenebilir.

  3. Evet mülkünüze sınırlayıcı erişim için iyi olduğunu doğrudur.2.

    için

Örnek

@interface UIView(PFXextended) 
-(NSArray*)PFXGetSubviewsOfType:(Class)class; 
@end