2011-01-28 23 views
6

NSObject öğesinden devraldığım bir sınıfa sahibim. Çocuk nesnelerini tutmak için bir NSMutableArray kullanır, örn. Kişi nesnelerini tutmak için NSMutableArray * öğelerini kullanan kişiler. NSFastEnumerator öğelerini nasıl uygularım?Özel Sınıfta NSFastEnumeration Uygulaması

denedim aşağıdaki ancak geçersiz:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len 
{ 
    if(state->state == 0) 
    { 
     state->mutationsPtr = (unsigned long *)self; 
     state->itemsPtr = items; 
     state->state = [items count]; 
     return count; 
    } 
    else 
     return 0; 
} 
+0

Nedir sizi yapmaya çalışıyorsun? Eğer sadece [dizi sayımı] kullanırsanız, saymak istediğiniz sayıyı alabilirsiniz, eğer dizinin içinde kullanacağınız dizinin belirli türlerini saymak istiyorsanız (dizi içinde nesne) <= hangisi hızlı numaralandırma –

+0

Uygulamamın delegesindeki Kişiler sınıfındaki örneğini şöyle yapabilirim: için (Kişiler için Kişi * p) { NSLog (p); } – user593733

cevap

18

NSFastEnumerationState yapısını doğru şekilde kullanmıyorsunuz. Her bir alanın açıklamasını görmek için NSFastEnumeration Protocol Reference'a bakın ve sabitler bölümüne bakın. Durumunuzda, state->mutationsPtr'u nil olarak bırakmalısınız. state->itemsPtr, bir NSArray veya NSMutableArray değil, nesnelerin C dizisine ayarlanmalıdır. Aynı nesneleri stackbuf olarak geçirilen diziye de eklemeniz gerekir. Ancak

, size numaralandırma nesneleri içerecek şekilde bir NSMutableArray kullandığınız beri, sadece o nesneye çağrıyı yönlendirmek olabilir:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len { 
    return [items countByEnumeratingWithState:state objects:stackbuf count:len]; 
} 
+2

'aramayı sadece bu nesneye yönlendirin' Şimdi neden bunu düşünmedim. Teşekkürler! – user593733

+0

Değer * mutationsPtr, arayan tarafından önbelleğe alınamaz mıydı? \t Durum daha güvenli olabilirdi-> mutationsPtr = & state-> extra [0]; NULL yoksayılıyorsa. –

1

bir NSFastEnumeration protokol var, ancak (varolmayan) NSFastEnumerator protokolünü kullanan ...

@interface People : NSObject <NSFastEnumeration> 
{ 
    NSMutableArray *items; 
} 

@implementation . Sorun bu olabilir mi?

+0

Uygulama sınıfımdaki Kişiler sınıfımda bir örneğim var diyelim ki şunu yapabilirim: için (Kişiler Kişileri Kişiler) { NSLog (p); } – user593733

İlgili konular