SORU
28 Mart 2012, ÇARŞAMBA


CopyWithZone uygularken en iyi yöntem:

Herkes aşağıdaki yorum yapabilir copyWithZone:, uygulama hakkında kafamda bazı şeylere açıklık getirmek için çalışıyorum

// 001: Crime is a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
    Crime *newCrime = [[[self class] allocWithZone:zone] init];
    if(newCrime) {
        [newCrime setMonth:[self month]];
        [newCrime setCategory:[self category]];
        [newCrime setCoordinate:[self coordinate]];
        [newCrime setLocationName:[self locationName]];
        [newCrime setTitle:[self title]];
        [newCrime setSubtitle:[self subtitle]];
    }
    return newCrime;
}

// 002: Crime is not a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
    Crime *newCrime = [super copyWithZone:zone];
    [newCrime setMonth:[self month]];
    [newCrime setCategory:[self category]];
    [newCrime setCoordinate:[self coordinate]];
    [newCrime setLocationName:[self locationName]];
    [newCrime setTitle:[self title]];
    [newCrime setSubtitle:[self subtitle]];
    return newCrime;
}

001:

  1. Sınıf adı doğrudan yazmak için en iyi [[Crime allocWithZone:zone] init] [[[self Class] allocWithZone:zone] init] kullanmalıyım?

  2. Kopyalama [self month] kullanmak için ok bugün ivan'ın ya da doğrudan bugün ivan'ın _month yani erişim olayım ki?

CEVAP
28 Mart 2012, ÇARŞAMBA


  1. Her zaman [[self class] allocWithZone:zone] bir kopyasını uygun sınıf oluşturma olduğundan emin olmak için kullanmanız gerekir. 002 gösterileri yüzden verdiğiniz örnek: Alt sınıflar [super copyWithZone:zone] arar ve uygun sınıfı, super sınıf örneği olmayan bir örneğini geri almak için bekliyoruz.

  2. Ben özellik ayarlayıcısı (örneğin, bildirim oluşturma) daha sonra ekleyebilirim herhangi bir yan etkileri hakkında endişelenmenize gerek yok bu yüzden bugün ivan'ın doğrudan erişim,. Unutmayın, alt sınıfların herhangi bir yöntemi geçersiz kılmak için ücretsiz. Sizin örnekte, ıvar başına iki ekstra mesajlar gönderiyorsunuz. Aşağıdaki gibi uygulamak

Kod:

- (id)copyWithZone:(NSZone *)zone {
    Crime *newCrime = [super copyWithZone:zone];
    newCrime->_month = [_month copyWithZone:zone];
    newCrime->_category = [_category copyWithZone:zone];
    // etc...
    return newCrime;
}

Eğer bugün ivan'ın kopyalamak ister elbette, onları korumak, ya da sadece ayarlayıcıları ne ayna onları atayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Elly Awesome

    Elly Awesome

    15 ŞUBAT 2010