2009-02-27 27 views
0

Nesnelerin bir koleksiyonunu içeren bir sınıfa sahibim. Sağlanan bir yüklemeyle eşleşen koleksiyonun ilk üyesini döndürecek bir yöntem oluşturmaya çalışıyorum.Tanınmayan seçici henüz hata ayıklama görebilir

... 
//predicate is a boolean method that accepts an object as its single parameter 
-(id<Notation>) getFirstChildMatching: (SEL) predicate declaredInInstance:(id) instance 
{ 
    NSMethodSignature *sig = [[instance class] instanceMethodSignatureForSelector:predicate]; 
    NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:sig]; 
    [myInvocation setTarget:instance]; 
    [myInvocation setSelector:predicate]; 

    int numItems = childNotations.count; 
    for(int i=0;i< numItems;i++) 
    { 
     id<Notation> thisNotation = [childNotations objectAtIndex:i]; 
     [myInvocation setArgument:thisNotation atIndex:2]; 
     BOOL result =NO; 
     [myInvocation retainArguments]; 
     [myInvocation invoke]; 
     [myInvocation getReturnValue:&result]; 

     if (result) 
      return thisNotation; 

    } 

    return nil; 
} 

Ben bu yöntemi test eden bir test sınıfı oluşturduk: Burada

toplama yöntemidir.

- (void) testGetFirstChildMatching 
{ 
    Leaf *line1 = [[Leaf alloc] initWithValue:1 step:Step_A andNumber:1]; 
    Leaf *line2 = [[Leaf alloc] initWithValue:2 step:Step_B andNumber:2]; 

    SEL mySelector = @selector(valueIs1:); 

    id<CompositeNotation> compositeNotation = [[CompositeNotation alloc] init]; 
    [compositeNotation addNotation:line1]; 
    [compositeNotation addNotation:line2]; 

    id notation = [compositeNotation getFirstChildMatching: mySelector declaredInInstance:self]; 
    STAssertEquals(YES, [notation isKindOfClass:[Leaf class]], @"Should be of type Leaf: %@", notation); 
    //Leaf *found = ((Leaf *)notation); 
    STAssertEquals([notation value], line1.value, @"Should have found line 1 with value 1: actual %i", [notation value]); 
    [line1 release]; 
    [line2 release]; 
} 

-(BOOL) valueIs1: (Leaf *) leaf 
{ 
    if (leaf.value == 1) 
     return YES; 

    return NO; 
} 

Ne bulma yaşıyorum "if (leaf.value == 1)" satırı üzerinde ben bir "tanınmayan seçici sınıfına gönderilen" alıyorum olmasıdır: İşte test yöntemi artı önermedir. Anlamsız olan şey, hata ayıklayıcının değer özelliğini ve değerini görebilmesidir, böylece nesne açıkça bu seçime sahiptir. Herhangi bir fikrin var mı?

btw Yaprak işlev tanımında notasyonu protokolünü

cevap

1

Sonunda sorunu buldum. Bu hat

[myInvocation setArgument:thisNotation atIndex:2]; 

oldu o daha az kafa karıştırıcı değişken isimlendirme stratejisini seçme

3

Typo uygular?

-(BOOL) valueIs1: (Leaf *) Leaf // <== should be "leaf" not "Leaf" ? 

bir alıyoruz gerçeği

, değil örneği "tanınmayan seçici sınıfa gönderilen" leaf bir Class olduğunu ima eder. İki şey kontrol etmek:
  • Yaprak başlatıcı initWithValue bir nesne dönen olduğundan emin olun.
  • addNotation: öğesinin diziye doğru olarak Yapraklar eklediğinden emin olun.
+0

İyi argüman

[myInvocation setArgument:&thisNotation atIndex:2]; 

Teşekkür olması gerekirdi. – danielpunkass

+0

aslında bu kodun yığın akışına aktarılmasında neden olan bir yazım hatasıydı. Orijinal isimler değiller. Gönderiyi düzeltirim – Ian1971

İlgili konular