SORU
28 EYLÜL 2012, Cuma


/ObjectiveC değişkenleri yerleri tanımı Bildirgesi?

Şimdiye kadar iOS ve objective C üzerinde çalışmaya başladığımızdan bu yana bir ve değişkenleri bildirme tanımlama olabilir çok farklı yerlerde şaşıran oldum. Bir yandan geleneksel C yaklaşımı var, diğer tarafta üstüne OO eklenecek yeni ObjectiveC direktifleri var. Benim değişkenleri için bu yerleri kullanma ve belki de bu benim anlayış doğru olmasını isterdim en iyi ve en pratik ve durumları anlamamıza yardımcı olur arkadaşlar misiniz?

İşte örnek bir sınıf.h ve .m):

#import <Foundation/Foundation.h>

// 1) What do I declare here?

@interface SampleClass : NSObject
{
    // 2) ivar declarations
    // Pretty much never used?
}

// 3) class-specific method / property declarations

@end

ve

#import "SampleClass.h"

// 4) what goes here?

@interface SampleClass()

// 5) private interface, can define private methods and properties here

@end

@implementation SampleClass
{
    // 6) define ivars
}

// 7) define methods and synthesize properties from both public and private
//    interfaces

@end
  • Benim anladığım 1 ve 4 olan C-stil dosya tabanlı bildirimleri ve tanımları var anlamıyorlar kavramının sınıf, ve böylece sahip olmak için kullanılan tam olarak nasıl yapacaklarını kullanılabilecek C. görmüştüm kullanılan uygulama statik değişken tabanlı tekiz önce. Kaçırdığım diğer uygun kullanan var mı?
  • İOS ile çalışırken benim almak bugün ivan'ın alost tamamen @sentez Direktifi dışında dışarı aşamalı edildi ve böylece çoğunlukla göz ardı edilebilir. Bu durumda?
  • Neden hiç özel arabirimleri yöntemleri bildirmek isterim ben? 5 ile ilgili: Özel Sınıf yöntemlerim gayet iyi arayüzü ilan etmediği bir derleme gibi görünüyor. Çoğunlukla okunabilirlik için mi?

Çok teşekkürler Millet!

CEVAP
28 EYLÜL 2012, Cuma


Şaşkınlığınızı anlayabiliyorum. Özellikle böyle büyük mükafat için son güncellemeleri ve yeni LLVM derleyici beri bugün ivan'ın ve özellikleri bildirilebilir şekilde değişti.

"Modern" Objective-C "N-C 2.0) seçimler. bir sürü zahmet etmeseydin." eski önce Örnek değişkenler arasında kıvırcık başlığında ilan edilmesi için kullanılan parantez { }:

// MyClass.h
@interface MyClass : NSObject {
    int myVar;
}
@end

Diğer sınıflardan uygulamanızda sadece, ama bu değişkenler erişmek için başardık. Erişimci yöntemleri bildirmek zorunda kaldığın için bunu yapmak, bu şöyle bir şey:

// MyClass.h
@interface MyClass : NSObject {
    int myVar;
}

- (int)myVar;
- (void)setMyVar:(int)newVar;

@end


// MyClass.m
@implementation MyClass

- (int)myVar {
   return myVar;
}

- (void)setMyVar:(int)newVar {
   if (newVar != myVar) {
      myVar = newVar;
   }
}

@end

Bu ve diğer sınıflardan bu örnek değişkeni de ayarlamak mümkün, her zamanki köşeli sözdizimini mesajları (arama yöntemleri) göndermek için kullandığınız:

// OtherClass.m
int v = [myClass myVar];  // assuming myClass is an object of type MyClass.
[myClass setMyVar:v 1];

El ile ve her erişimci yöntemini bildirmek, çünkü oldukça rahatsız ediciydi, @property @synthesize otomatik olarak erişimci yöntemleri oluşturmak için tanıtıldı:

// MyClass.h
@interface MyClass : NSObject {
    int myVar;
}
@property (nonatomic) int myVar;
@end

// MyClass.m
@implementation MyClass
@synthesize myVar;
@end

Sonuç daha net ve daha kısa kod. Erişimci yöntemleri uygulanacak ve hala ayraç sözdizimi daha önce olduğu gibi kullanabilirsiniz. Ama buna ek olarak, aynı zamanda erişim özellikleri için nokta sözdizimini kullanabilirsiniz:

// OtherClass.m
int v = myClass.myVar;   // assuming myClass is an object of type MyClass.
myClass.myVar = v 1;

4.4 Güncellemelerinden beri örnek değişkeni, artık kendini ilan etmek zorunda değilsin ve @synthesize da atlayabilirsiniz. Eğer bir ıvar ilan yok eğer doğru değilse, derleyici sizin için katacak ve aynı zamanda @synthesize kullanmak zorunda kalmadan erişimci yöntemleri oluşturur.

Otomatik olarak oluşturulan ıvar için varsayılan adı veya özelliği, bir alt çizgi ile başlayan. @synthesize myVar = iVarName; kullanarak oluşturulan ıvar adını değiştirebilirsiniz

// MyClass.h
@interface MyClass : NSObject 
@property (nonatomic) int myVar;
@end

// MyClass.m
@implementation MyClass
@end

Bu tam olarak yukarıdaki kod gibi çalışır. Uyumluluk nedenleriyle hala başlığında bugün ivan'ın bildirebilirsiniz. Ama çünkü tek sebebi neden istiyorsunuz bunu yapmak ve bildirmek bir özellik) oluşturmak için özel değişken, artık bunu uygulama dosyasını ve bu tercih edilen yoldur.

Uygulama dosyasında @interface bir blok aslında Extension ve ileri yöntemler (artık gerekli olmadığını ilan (re) özelliklerini bildirmek için kullanılır. Mesela senin başlığında readonly bir özellik bildirebilirsiniz.

@property (nonatomic, readonly) myReadOnlyVar;

ve redeclare uygulamanızda readwrite olarak özellik sözdizimini kullanarak ve sadece doğrudan erişim yoluyla değil ıvar için ayarlanmış olması için dosya.

Değişkenleri bildirmek için @interface @implementation herhangi bir blok dışında, evet bu düz C değişkenler ve iş tam olarak aynı tamamen.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008