SORU
31 Ocak 2012, Salı


Neden bir ıvar kullanırsınız?

Ben genellikle bu soruyu başka şekilde sordu, iOS: must every iVar really be property? gibi (ve bu Q bbum cevabı ben gibi).

Özellikleri neredeyse sadece benim kod kullanıyorum. Sık sık, ancak, uzun bir süre iOS geliştiriyor ve geleneksel bir oyun programcısı olan bir müteahhit ile çalışıyorum. Neredeyse hiç özelliklerini bildiren kod yazıyor ve bugün ivan'ın üzerine eğilir. Ben 1. çünkü bunu bildiğini varsayıyorum) özellikleri her zaman Objective C 2.0 kadar yoktu beri buna alışkın (Ekim '07) ve 2.) bir alıcı yoluyla değil, en az bir performans artışı için belirleyici.

Sızıntı yok o kod yazıyor olsa da, hala ona bugün ivan'ın özellikleri üzerinde kullanmayı tercih ediyorum. Bu konuda konuştuk ve o daha fazla veya daha az KVO kullanarak değildik beri özelliklerini kullanmak için bir sebep olarak görüyor ve hafıza sorunlarını dikkate alarak bu konuda tecrübeli.

Benim sorum daha çok... Neden hiç ıvar bir dönem - deneyimli ya da değil, kullanmak istersin. Gerçekten bir ıvar kullanarak haklı bir performans farkı o kadar büyük var mı?

Açıklama bir nokta olarak da, ben ayarlayıcıları geçersiz kılma yapılması gerektiği ve bu özelliği ile alıcı / ayarlayıcı içinde bir korelasyon ıvar kullanın alıcılar. Ancak, alıcı / ayarlayıcı veya init dışında, hep self.myProperty sözdizimi kullanın.


1 düzenleyin

İyi yanıtları takdir ediyorum. Yanlış gibi görünen adrese istediğim tek bir ıvar bir özelliği yok saklama yeri olsun. Sadece sınıf bir devamı olarak tanımlayın. Bu yabancılardan özelliği gizler. Ayrıca bu özellik arayüz salt okunur bildirmek ve böyle bir uygulaması olarak okumayazma tanımlayabilirsiniz:

// readonly for outsiders
@property (nonatomic, copy, readonly) NSString * name;

ve sınıf devamı var:

// readwrite within this file
@property (nonatomic, copy) NSString * name;

Tamamen "özel" sadece sınıf devamında beyan.

CEVAP
31 Ocak 2012, Salı


Sarma

Eğer ıvar özel ise, programın diğer bölümleri bu kadar kolay olamaz. Bildirilen bir özelliğe sahip, zeki insanların erişim ve kolayca mutasyona bu set ile.

Performans

Evet, bu bazı durumlarda bir fark yaratabilir. Bazı programlar programı (gerçek zamanlı sanırım) bazı bölgelerinde herhangi bir objc mesajlaşma kullanamazlar nerede kısıtlamaları var. Diğer durumlarda, doğrudan hızlı erişim isteyebilirsiniz. Diğer durumlarda, optimizasyon bir güvenlik duvarı gibi davranır mesajlaşma objc çünkü. Son olarak, başvuru sayısı faaliyetlerinizi azaltın ve en yüksek bellek kullanımı eğer doğru yapılırsa () en aza indirmek.

Sıradan Olmayan Bir Tip

Eğer C tipi Varsa, doğrudan erişim daha iyi bir yaklaşım olur bazen. örneğin: Bu tür copyable olmayabilir veya kopyalamak için önemsiz olmayabilir.

Çoklu kullanım

Senin bugün ivan'ın çok pimpirikli. Birden çok iş parçacığı bağlamında veri bütünlüğünü sağlamak gerekir. Böylece, kritik bölümlerde birden çok üye için doğrudan erişim iyilik olabilir. Eğer aşırı veri set ile sopa, kilitler genellikle evresel olması gerekir ve genellikle çok daha fazla satın almalar (bazen önemli ölçüde daha fazla) sona erecek.

Program Doğruluğu

Alt sınıflardan herhangi bir yöntemi geçersiz kılabilirsiniz beri, sonunda arabirimi yazmaya karşı uygun bir devlet yönetimi arasında anlamsal bir fark olduğunu görebilirsiniz. Program doğruluğu için doğrudan erişim dealloc, en iyi kısmen inşa edilmiş devletler senin başlatıcılar ... ... ve doğrudan erişim kullanmak için özellikle yaygındır. Ayrıca bir erişimci, kolaylık yapıcı, copy, mutableCopy ve arşivleme/serileştirme uygulamaları uygulamalarında bu ortak bulabilirsiniz.

Ayrıca bir hareket olarak daha sıkher şeyi halka okumayazma bir erişimciuygulama ayrıntılarını İyi Veri/olan bir zihniyet. Bazen doğru yan etkileri bir alt sınıf' geçersiz kılma doğru şeyi yapmak için tanıştırabilir. yanımda ihtiyacınız

İkili Boyutu

İlan her şeyi varsayılan olarak okuma-yazma genellikle bir an için programın yürütme düşündüğünüz zaman hiç gerek birçok erişimci yöntemleri, sonuçları. Programınız için biraz yağ ekleyin ve saat olarak yükler.

Karmaşıklığı En Aza İndirir

Bazı durumlarda, sadece tür bir yöntem ile yazılmış özel bir bool gibi basit bir değişken için tüm bu ekstra iskele korumak eklemek için tamamen gereksiz ve bir okuyun.


Bu özellikleri veya set kullanarak kötü - her önemli avantajları ve kısıtlamaları vardır demek değil. Tasarım için birçok OO dilleri ve yaklaşımları gibi, aynı zamanda ObjC uygun görüş ile erişenleri iyilik gerekir. Sapmak gerekir zamanlar olacaktır. Bu nedenle, genellikle en iyi ıvar beyan ettiği bu uygulama (örneğin @private ilan) doğrudan erişimleri kısıtlamak için olduğunu düşünüyorum.


yeniden Düzenleme 1:

Çoğumuz gizli erişimci bir dinamik olarak nasıl ezberlemiş (adını bildiğimiz sürece......). Bu arada, çoğumuzdeğildüzgün görünür olmayan bugün ivan'ın erişme (EP ötesinde) ezberledim. Sınıf devamıyardımcı olurgüvenlik açıkları takdim ediyor , ama.

Bu çözüm çok açık:

if ([obj respondsToSelector:(@selector(setName:)])
  [(id)obj setName:@"Al Paca"];

Şimdi EP olmadan bir ıvar sadece, ve dene.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • FF Radio

    FF Radio

    16 Mayıs 2008
  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014