SORU
26 Kasım 2012, PAZARTESİ


Bugün ivan'ın koymak nerede "modern" Objective-C?

Kitap "iOS6 Öğreticiler tarafından" Ray Wenderlich tarafından daha fazla yazı hakkında çok güzel bir bölüm var "modern" Objective-C kodu. Bir bölümünde kitap uygulama dosyasına sınıfı başlığından bugün ivan'ın taşımak açıklamaktadır. Tüm bugün ivan'ın özel olması gerektiğinden bunu yapmak için doğru şey gibi görünüyor.

Ama şu ana kadar bunu yapmanın 3 yolu buldum. Herkes farklı bir şekilde yapıyor.

1.) @Altına bugün ivan'ın ayraç (Bu kitapta iş böyle yapılır) bir blok içindeki implementantion.

2.) @Altına bugün ivan'ın ayraç blok olmadan implementantion

3.) @İmplementantion yukarıda özel Arayüzü içinde bugün ivan'ın (sınıf bir uzantısı)

Tüm bu çözümler, iyi ve başvurum davranış herhangi bir fark etmemişim şimdiye kadar iş gibi görünüyor. Hayır" ama bazı dersler yazmam gerekiyor ve benim kod için tek bir yol seçmek istiyorum. "doğru var sanırım

Hangi yoldan gitmeliyim?

Edit: sadece bugün ivan'ın burada bahsediyorum. Özellikler değil. Sadece ek değişkenleri nesne yalnızca kendisi için ihtiyaç ve o dışarıda maruz bırakılmamalıdır.

Kod Örnekleri

1)

#import "Person.h"

@implementation Person
{
    int age;
    NSString *name;
}

- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end

2)

#import "Person.h"

@implementation Person

int age;
NSString *name;


- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end

3)

#import "Person.h"

@interface Person()
{
    int age;
    NSString *name;
}
@end

@implementation Person

- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end

CEVAP
26 Kasım 2012, PAZARTESİ


Yetenek koymak örnek değişkenleri @implementation blok, ya da bir sınıf uzantısı gibi, bir özelliği “modern Objective-C çalışma zamanı”, kullanılan her sürümü iOS ve 64-bit Mac OS X programlar.

Eğer 32-bit Mac OS X uygulamaları yazmak istiyorsanız, @interface bildiriminde örneği değişkenleri koymak gerekir. Şansını uygulama 32-bit bir sürümünü desteklemek için, ama gerek yok. OS X üzerinde beş yıl önce yayımlanan 64-bit sürüm 10.5 beri apps (Leopar), desteklemiştir.

Yani, diyelim ki sadece modern çalışma zamanı kullanacağı uygulamalar yazıyoruz varsayalım. Nerede bugün ivan'ın koymak?

Seçenek 0: @interface (yapma)

İlk olarak, biz neden orayayok@interface bir beyanda örnek değişkenleri koymak istiyorum.

  1. @interface Bir de kalkmış örnek değişkenleri sınıf kullanıcılar için uygulama ayrıntılarını gösterir. Bu kullanıcılar (kendi sınıfları kullanırken kendine bile!) neden olabilir yeterli bir uygulama ayrıntıları güvenmek. (Bu, bugün ivan'ın*.* 15) ilan edip bağımsız

  2. Koyarak örnek değişkenleri @interface yapar derleme daha uzun sürüyor, çünkü her zaman biz eklemek, değiştirmek veya kaldırmak ıvar bildirimi yapmamız gereken tek şey yeniden her .m dosya ithalat arabirimi.

@interface örnek değişkenleri koymak istemiyoruz. Onları nereye koyalım?

Seçenek 2: parantez (Sakın yapma) . @implementation

Bir sonraki umalım ki bu seçeneği tartışmak 2, “@ayraç blok olmadan implementantion altına bugün ivan'ın”. Yapardeğilörnek değişkenleri bildirmek! Bu bahsettiğin:

@implementation Person

int age;
NSString *name;

...

Bu kod iki global değişken tanımlar. Herhangi bir örnek değişkenleri bildirmek değildir.

Sorun değil tanımlamak için global değişkenleri .m dosyası bile @implementation ihtiyacınız olursa global değişkenler - örneğin, çünkü istediğiniz tüm örneklerini paylaşmak bazı devlet gibi bir önbellek. Ama bugün ivan'ın ilan etmiyor çünkü bugün ivan'ın bildirmek için bu seçeneği kullanabilirsiniz. (Ayrıca, global değişkenler uygulamanız için özel genellikle static genel ad kirletici ve Bağlantı zamanı riske hataları önlemek için beyan edilmelidir.)

Bu seçenekleri 1 ve 3 bırakır.

Seçenek 1: parantez () ile @implementation

Genellikle seçenek 1 kullanmak istiyoruz: böyle @implementation ana blok, parantez içinde, koyun:

@implementation Person {
    int age;
    NSString *name;
}

Varlıklarını özel, sorunları sınıf bir uzantısı olarak onları koymak için genellikle bir sebep yok çünkü az önce tarif ettiğim ve önleme tutar çünkü onları buraya koyacağız.

Ne zaman bir seçenek, 3, sınıf bir uzantısı koyarak kullanmak istiyor muyuz?

Seçenek 3: bir sınıfta uzatma (Gerekli Sadece)

Neredeyse hiç sınıf @implementation aynı dosya içinde sınıf bir uzantısı olarak onları koymak için bir neden yok. De sadece bu durumda @implementation koy.

Ama bazen birden fazla dosya içine kaynak kodunu ayırmak için yeterince büyük bir sınıf yazabiliriz. Bu kategorileri kullanarak yapabiliriz. Örneğin, olsaydık uygulanması UICollectionView (bir hayli büyük sınıf), biz olabilir karar vermek istiyoruz koydu kodu yönetir kuyruklar yeniden kullanılabilir görünümler (hücre ve ek görüş) ayrı bir kaynak dosyası. Bir kategori içine bu mesajları ayırarak bunu yapabiliriz:

// UICollectionView.h

@interface UICollectionView : UIScrollView

- (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;
@property (nonatomic, retain) UICollectionView *collectionViewLayout;
// etc.

@end

@interface UICollectionView (ReusableViews)

- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;

- (void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;

- (id)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath*)indexPath;
- (id)dequeueReusableSupplementaryViewOfKind:(NSString*)elementKind withReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath*)indexPath;

@end

TAMAM, şimdi biz uygulamak ana UICollectionView yöntemleri UICollectionView.m ve biz uygulamak yöntemleri yönetmek yeniden manzarası UICollectionView ReusableViews.m, hangi yapar bizim kaynak kodu biraz daha yönetilebilir.

Ama yeniden görüntülemek yönetimi kodumuzu biraz örnek değişkenleri ihtiyacı var. Bu değişkenler derleyici .o dosyasında onları yayacak kadar UICollectionView.m ana sınıfı @implementation maruz olmak zorunda. Ve biz de bu yöntemleri bugün ivan'ın kullanabilmesi UICollectionView ReusableViews.m, kodu bu örnek değişkenleri ortaya çıkarmak için gereken.

Bu sınıfın bir uzantısı ihtiyacımız var. Özel bir üstbilgi dosyasında bir sınıf olarak yeniden-yönetimi bugün ivan'ın uzantısı koyabilirsiniz:

// UICollectionView_ReusableViewsSupport.h

@interface UICollectionView () {
    NSMutableDictionary *registeredCellSources;
    NSMutableDictionary *spareCellsByIdentifier;

    NSMutableDictionary *registeredSupplementaryViewSources;
    NSMutableDictionary *spareSupplementaryViewsByIdentifier;
}

- (void)initReusableViewSupport;

@end

Kütüphanemiz kullanıcıları için bu başlık dosyası gemi etmeyeceğiz. Sadece UICollectionView ReusableViews.m her şey o kadar UICollectionView.m ve ithal edeceğizihtiyacı varbu bugün ivan'ın görmek onları görebilirsiniz. Ayrıca yeniden kullanılabilir-view-yönetim kod başlatmak için çağrı init ana yöntem istediğimiz bir yöntem yaptık. UICollectionView.m -[UICollectionView initWithFrame:collectionViewLayout:] bu yöntem ararız ve UICollectionView ReusableViews.m bunu uygulayacağız.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HER0R

    HER0R

    16 Aralık 2007
  • ICON

    ICON

    19 EKİM 2011
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007

İLGİLİ SORU / CEVAPLAR