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

  • Film Riot

    Film Riot

    16 NİSAN 2006
  • HereWeStayKings

    HereWeStayKi

    3 NİSAN 2013
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011