it-swarm.dev

Amaç-C de Özellikler ve Örnek Değişkenler

Objective-C'deki özellikler ve örnek değişkenler hakkında kafam karıştı.

Aaron Hillegass'ın "Mac OS X için Kakao Programlaması" ndan yarı yoldayım ve her şey mantıklı. Böyle bir şeyi bir sınıfa ilan edersiniz:

@class Something;

@interface MyClass : NSObject {
    NSString *name;
    NSArray *items;

    Something *something;

    IBOutlet NSTextField *myTextField;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
  • Diğer nesnelerin name ve items örnek değişkenlerimizi manipüle etmesi gerektiğinden, onlar için erişimciler/mutasyonlar üretmek için @property/@synthesize işlevini kullanırız. Sınıfımız içinde, erişimcileri/mutasyonları kullanmıyoruz - sadece örnek değişkeniyle doğrudan etkileşime giriyoruz.

  • something, sadece sınıfımızda kullanacağımız bir örnek değişkendir ve başka hiç kimsenin kullanması gerekmediğinden, bunun için bir çift erişimci ve mutasyon oluşturmuyoruz.

  • Kullanıcı Arabirimimizdeki bir metin alanıyla etkileşime girmemiz gerekiyor, bu yüzden IBOutlet değerini ilan ediyoruz, bağlayın ve işimiz bitti.

Hepsi çok mantıklı.

Ancak, iPhone dünyasında işler farklı görünüyor. İnsanlar her bir örnek değişkeni için özellikler bildirir, IBOutlets için özellikler bildirir ve sınıf değişkenleri içinde ile etkileşmek için accessors/mutators kullanın (örneğin, [self setName:@"Test"] yerine name = @"Test" yazarlar).

Niye ya? Ne oluyor? Bu farklar iPhone'a özgü mü? Tüm örnek değişkenler için özellikler bildirmenin, IBOutlets için özellikler bildirmenin ve kendi sınıfınız içinde erişimciler/mutasyon kullanmanın avantajları nelerdir?

55
Steve Harrison

İPhone dünyasında çöp toplayıcı yok. Referans sayma ile belleği dikkatlice yönetmeniz gerekecektir. Bunu akılda tutarak, arasındaki farkı göz önünde bulundurun:

name = @"Test";

ve

self.name = @"Test";
// which is equivalent to:
[self setName: @"Test"];

Önceden düşünmeden doğrudan örnek değişkenini ayarlarsanız, önceki değere olan referansı kaybedersiniz ve alıkoyma sayısını ayarlayamazsınız (released el ile olmalıdır). Bir özellik üzerinden erişirseniz, yeni atanan nesnenin tutma sayısını artırarak, sizin için otomatik olarak ele alınır.

Temel kavram iPhone'a özgü değildir, ancak çöp toplayıcı olmayan bir ortamda çok önemli hale gelir.

29
Mehrdad Afshari

Özellikler, örneğin değişkenler için erişimciler oluşturmak için kullanılır, sihir yoktur.  

Aynı erişimcileri elle uygulayabilirsiniz.

Aaron Hillegass'ın üye değişkenleri için 3 bellek yönetimi stratejisi kitabındaki örneklerinde bulabilirsiniz. Onlar assign/copy/retain. Verilen değişken için gerekli olanlardan birini seçersiniz.

Sanırım Objective-c’de hafıza yönetimini ...

Erişimciler, her değişken için karmaşıklık ve bellek yönetimi farklarını gizler.

Örneğin:

name = @"Test"

basit bir atamadır, name şimdi NSString @"Test" 'ye referans tutar. Ancak copy veya retain kullanmaya karar verebilirsiniz. Hangi bellek yönetimi versiyonunu erişimci seçerseniz seçin, karmaşıklığı gizler ve değişkene her zaman (veya benzeri) erişirsiniz:

[self setName:@"Test"] 
[self name]

Şimdi setName:assign/copy or retain kullanıyor olabilir ve endişelenmenize gerek yok.

Tahminimce iPhone eğitmenleri, yeni geliştiricilerin bellek yönetimini atlamasını kolaylaştırmak için özellikleri kullanıyor (özellikleri her zaman elle uygulamak yerine özelliklere sahip uygun erişimciler oluşturmak için kullanışlı olsa da).

6
stefanB

Ancak, iPhone dünyasında işler farklı görünüyor. İnsanlar her bir örnek değişkeni için özellikler bildirir, IBOutlets için özellikleri bildirir ve sınıf içindeki örnek değişkenlerle etkileşimde bulunmak için accessors/mutators kullanın (örneğin, [self setName:@"Test"] yerine name = @"Test" yazarlar).

Bu iPhone'a özgü değil. init yöntemleri ve dealloc yöntemi dışında, erişimcilerinizi her zaman kullanmak iyi bir uygulamadır. Başlıca yararı, özellikle Mac'te (Cocoa Bindings ile), erişimcilerinizi kullanmanın ücretsiz KVO bildirimleri anlamına gelmesidir.

İnsanların “her bir tek örnek değişken için özellikler bildirmesinin” nedeni, büyük olasılıkla tüm örnek değişkenlerinin özellik olarak göstermek istedikleri şeyler olmasıdır. Özel tutmak isteyecekleri bir şeyleri olsaydı, başlık dosyasında bunun için bir özellik beyan etmezlerdi. (Bununla birlikte, söz konusu ücretsiz KVO bildirimlerini almak için uygulama dosyasındaki bir sınıf uzantısında bir özellik yapabilirler.)

Bence, satış yerleri için mülk bildirimi gereğinden fazladır. Bir nokta göremiyorum. Bir özellik yapmazsanız, uç yükleyici, çıkışı bu örnek için uygun olan doğrudan örnek değişken erişimi ile ayarlar.

3
Peter Hosey

Modern kalkınmanın en iyi uygulamaları belirlemek, tanımlamak ve uygulamak için çok güçlü bir girişimde bulunduğunu ileri süreceğim.

Bu en iyi uygulamalar arasında devamlılık ve tutarlılık buluyoruz.

Erişimcilerin init ve dealloc yöntemlerinde kullanılmasının tartışılmasının yanı sıra, enkapsülasyon , polimorfik var uygulamaları dahil olmak üzere (- her ikisinin de izin verdiği) soyutlama ve yeniden düzenleme) ve en iyi süreklilik ve tutarlılık uygulamalarını kolaylaştırmak. Nesne yönelimli bir dilin temel yararları, bu şekilde işler yaparken ve dilin yeteneklerinin tamlığını kullanarak ortaya çıkar. Her zaman birinin kodlamasında tutarlı olmak, yukarıda bahsedilen herhangi bir üst düzey programcının genellikle onaylayacağı gibi, önceden belirlenmiş bir faydadır.

2
JRT

Böyle yazabilirsin

//MyClass.h

@class Something;

@interface MyClass : NSObject 

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *items;

@end 

//MyClass.m
@interface MyClass() 

@property (nonatomic, strong) IBOutlet NSTextField *myTextField;
@property (nonatomic, strong) Something *something;

@end
0
Shafraz Buhary