为什么使用dot-syntax会两次调用此语句的LHS?

时间:2009-03-27 06:01:19

标签: objective-c

此测试将失败:

#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

如果我将[self get].name替换为[[self get] name],则会通过。即,使用点语法,'。'的LHS。被评估两次。这是怎么发生的?

2 个答案:

答案 0 :(得分:2)

公开承认你在Objective-C中使用点语法很可能会让你被纯粹主义者焚烧; - )

在这个特定场景中看起来好像是bug,正如线程所说的那样,它可能是一些正在扩展错误的预处理魔法。

答案 1 :(得分:2)

这是一个编译器错误,应该在gcc-4.2中修复。