İki yıldan daha kısa bir süre önce Robert McNally tarafından "Kod Komutları: Objective-C Kodlaması için En İyi Uygulamalar" adlı alçakgönüllü bir makaleyi okuduktan sonra , Objective-C sınıflarımın hemen hemen her veri üyesi için özellik kullanma uygulamasını kabul ettim ( Mayıs 2012 itibariyle 3. emir). McNally bunu yapmak için şu nedenleri listeler (benim vurgu):
- Özellikler erişim kısıtlamalarını zorunlu kılar (salt okunur gibi)
- Özellikler bellek yönetimi politikasını zorunlu kılar (güçlü, zayıf)
- Özellikler, özel ayarlayıcıları ve alıcıları şeffaf bir şekilde uygulama fırsatı sunar.
- İş parçacığı güvenliği stratejisini uygulamak için özel ayarlayıcılar veya alıcılar içeren özellikler kullanılabilir.
- Örnek değişkenlerine erişmenin tek bir yoluna sahip olmak kod okunabilirliğini artırır.
Mülklerimin çoğunu özel kategorilere koydum, bu nedenle 1 ve 4 sayısı genellikle çalıştığım konular değil. 3 ve 5 numaralı argümanlar daha yumuşaktır ve doğru araçlar ve diğer tutarlılıklarla sorun yaratmayabilirler. Son olarak, bu argümanlardan en etkili olanı 2 numaralı bellek yönetimi idi. Bunu o zamandan beri yapıyorum.
@property (nonatomic, strong) id object; // Properties became my friends.
Son birkaç projem için ARC'yi kullanmaya başladım, bu da hemen hemen her şey için özellik oluşturmanın hala iyi bir fikir mi, yoksa biraz gereksiz mi olduğundan şüphe duymamı sağladı. ARC, Objective-C nesnelerini benim için yöneten bellekle ilgileniyor, bu da çoğu strong
üye için sadece ivar'ları beyan ederseniz iyi çalışıyor. AR-öncesi ve sonrasında yine de manuel olarak yönetmeniz gereken C-tipleri ve weak
özellikler çoğunlukla herkese açıktır.
Tabii ki hala sınıfın dışından erişilmesi gereken her şey için özellikleri kullanıyorum, ancak çoğu veri üyesi uygulama başlığı altında ivar olarak listelenirken, bunlar çoğunlukla sadece bir avuç özelliktir.
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Bir deney olarak bunu biraz daha titiz bir şekilde yapıyorum ve her şey için özelliklerden uzaklaşmanın bazı olumlu olumlu yan etkileri var.
- Veri üye kodu gereksinimleri (
@property
/@synthesize
) sadece ivar bildirimine kadar küçüldü. self.something
Referanslarımın çoğu sadece temizlendi_something
.- Hangi veri üyelerinin özel (ivars) ve hangilerinin halka açık (mülkler) olduğu kolayca ayırt edilebilir.
- Son olarak, Apple'ın amaçladığı amaçların bu olduğu gibi 'hissediyor', ancak bu öznel spekülasyon.
Soru üzerine : Yavaşça karanlık tarafa doğru kayarım, uygulama ivarları lehine daha az özellik kullanarak. Bana neden her şey için özellik kullanmaya bağlı kalmam gerektiğine dair biraz akıl sağlayabilir misin, ya da neden sadece gerektiğinde daha fazla ivar ve daha az özellik kullanmam gerektiğine dair mevcut düşünce trenimi onaylayabilir misin? Her iki taraf için en ikna edici cevap notumu alacak.
DÜZENLEME: McNally Twitter'da ağırlıyor: "Bence mülklere bağlı kalmamın temel nedeni: her şeyi yapmanın bir yolu, her şeyi (KVC / KVO dahil) yapıyor."