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

  • boniver

    boniver

    17 NİSAN 2006
  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • RiceBunny

    RiceBunny

    16 ŞUBAT 2006