2009-03-27 8 views
3

Ce test échouera:Pourquoi l'utilisation de la syntaxe à points invoque-t-elle le LHS de cette instruction deux fois?

#import "GTMSenTestCase.h" 

@interface Person : NSObject 
@property (readonly) NSString *name; 
@end 
@implementation Person 
- (NSString *)name { return @"Nick"; } 
@end 

@interface TemplateUnitTest : GTMTestCase @end 

@implementation TemplateUnitTest 

static BOOL called = NO; 
- (Person *)get { 
    if (called) { STFail(nil); } 
    called = YES; 
    return [[Person new] autorelease]; 
} 

- (void)testPropertyMakesThingGetSentTwice { 
    NSString *s = [[self get].name stringByAppendingString:@"foo"]; 
    STAssertEqualObjects(@"Nickfoo", s, nil); 
} 

@end 

Si je remplace le [self get].name avec [[self get] name], il passe. c'est-à-dire, en utilisant la syntaxe point, le LHS du '.' est évalué deux fois. Comment cela peut-il arriver?

Répondre

2

Admettre en public que vous utilisez la syntaxe de points dans Objective-C est susceptible de vous faire brûler sur le bûcher par les ;-) puristes

On dirait qu'il est un bug dans ce scénario particulier, comme le fil dit, c'est probablement une magie de pré-traitement qui l'étend mal.

+0

Ah, merci :). Considérez-moi comme un converti à la pureté maintenant. Dans mon cas, le sélecteur appelait un service web - méchant. J'ai enregistré un bug avec apple (# 6729855), si cela vous intéresse. –

2

C'était un bogue du compilateur, et devrait être corrigé dans gcc-4.2.

Questions connexes