2013-03-02 14 views
5

Xcode 4.4'ten önceki pek çok projede, geliştiricilerin aynı adı taşıyan bir ivar ve özellik eşzamanlı olarak ilan ettiklerini fark ettim. ÖrnekNeden ivar ve mülkün aynı isimle beyan edilmesi gerekiyor?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

Yani nedenini bilmiyorum?

+1

dup: http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-görünüyor- – justin

cevap

1

Başkaları için konuşamam ama aynı adı kullanmıyorum. Bir örnek değişkeni bildirirsek, bu durum önde gelen altçizgiyle olur, bu nedenle örnek değişkenine veya setter/getter yöntemine başvurduğum açıkça belli olur.

Xcode 4.4+ ile, örnek değişkenini bildirmeniz veya @synthesize numaralı telefonu aramanız gerekmez ve derleyici otomatik olarak bir alt çizgi ile bir örnek değişkeni oluşturur ve sizin için setter/getter yöntemini sağlar. Bununla birlikte, bu mekanizmanın çok iyi bir fikir olduğunu sanmıyorum, çünkü geliştiricilerin, maruz kalmaması gereken sınıflarının özelliklerini açığa çıkarmaları konusunda teşvik ediyor.

Örneğin, bu itibaren iOS 6 Gelişim alınır: Ben bir kerede çok fazla kavramlarla bir acemi şaşırtmak istemiyorum anlamak ederken, Şimdi

@interface BIDViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *button; 
- (IBAction)buttonPressed:(UIButton *)sender; 
@end 

, hemen sahip Nesne Odaklı Kapsülleme, hem UIButton nesnesini hem de eylem yöntemini bu görünüm denetleyicisinin kullanıcılarına göstererek ve her ikisi de açığa çıkarılmamalıdır.

ne olur, örneğin, bir kullanarak sınıf yaparsa bu:

BIDViewController *vc = ...; 
vc.button = nil; 

veya

vc.buttonPressed(mySegmentedControl); 

Tüm şey gevşek tatili. Şimdi bir programı kırmanın 1000 yolu varken ve bunların hepsine karşı savunamayız, zaten zayıf bir sistem yapmak istemiyoruz (Objective-C, kimin kime başvurabileceğini tanımlamak açısından çok az değerlidir) senin yöntemlerin) zayıf.

Yukarıdaki uygulama daha iyi her ikisi de Interface Builder tarafından onur duyuyoruz, özel örnek değişkenler ve yöntemler kullanılarak yapılır:

@implementation BIDViewController() 
{ 
    IBOutlet UIButton *_button; 
} 
- (IBAction)_buttonPressed:(UIButton *)sender; 

@end 

ve herhangi birini kullanarak sınıfları bu modeli kırma sert bir zamana sahip olacaktır.

Ama elbette bu bir geliştirici için daha fazla düşünmek ve yazmak, ve böylece Apple daha az zamanda ne yapmak istediklerini elde edebilmeleri için yeni özellikleri tanıttı (sadece bir çıkışa sürüklediğinizde çok az yazım var başlık dosyası ve hem beyanname hem de uygulama iskeleti sizin için sağlanmıştır).

+0

için "örnek değişkenine veya setter/getter yöntemine atıfta bulunursam açıkça görülüyor" - şu anda bariz: 'self.foo' bir özellik, 'foo' bir ivar. –

+0

@ H2CO3 Bu özgeçmişini kaçırmak kolay bir hatadır ... – trojanfoe

+0

Bu yazıda gördüğünüz gibi: http://inessential.com/2010/06/28/how_i_manage_memory Yazar bir ivar kullanmak ve aynı ada sahip bir özellik. Ve niyetini anlamıyorum. – Proton

7

Sadece bir stil meselesi ve geçmiş derleyicilerin davranışlarına alışkın.

Artık yeni derleyicide bu gerekli değildir. Bir mülk oluşturduğunuz anda sahnenin arkasında bir sentez oluşturulur ve sentezlenir.

Derleyici, bu varsayılan davranışı değiştirmeyi bile tercih edebileceğiniz bir takma ad ile _propertyName olarak sentezler.

@interface AppDelegate : NSObject <NSApplicationDelegate>{ 
    NSString *bigString; 
} 
@property(strong)NSString *smallString; 
@end 

@implementation AppDelegate 
@synthesize smallString=bigString; 
-(void)awakeFromNib{ 
    [email protected]"hello"; 
    NSLog(@"%@",self.smallString); 
} 

@end 
+0

Doğru cevap bu, +1. Bu bir Xcode sürümü meselesi değil, derleyicinin belirli bir sürümünde uygulanan dil lehçesi versiyonu. –

+0

@ H2CO3: Teşekkürler, Ve bana +1 verdiğinizde, GOOD hissediyorum :) –

+0

Bu satırın anlamı nedir? @ Smallnthring = bigString; ' – Proton

İlgili konular