为什么会这样:
- (void) setupInteraction:(IBITSInteraction*)interaction withInfo:(NSDictionary*)info
{
CGRect rect = ([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero);
interaction.frame = rect;
...
}
为什么不这样做?:
- (void) setupInteraction:(IBITSInteraction*)interaction withInfo:(NSDictionary*)info
{
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero);
...
}
我认为完全一样......
@property (nonatomic, assign) CGRect frame;
及其各自的@synthesize
提前致谢。
答案 0 :(得分:3)
这是GCC 4.2前端中的一个错误,也可以在LLVM-GCC 4.2中重现。恭喜!当分配的值是条件运算符产生的表达式时,这些编译器在使用点语法进行属性赋值时会出现问题。
以下代码重现了该问题并显示了两个源代码解决方案:正如您所注意到的那样,一个是使用临时变量。另一种解决方案是使用传统的Objective-C消息发送语法而不是点语法:
#import <Foundation/Foundation.h>
CGRect CGRectFromString(NSString *string);
@interface SomeClass : NSObject
@property (nonatomic, assign) CGRect frame;
@end
@implementation SomeClass
@synthesize frame;
@end
int main(void) {
NSDictionary *info;
SomeClass *interaction;
NSString *kInteractionFrameKey;
CGRect rect;
rect = [info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero;
interaction.frame = rect;
[interaction setFrame:([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero)];
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero);
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectZero : CGRectFromString([info objectForKey:kInteractionFrameKey]));
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectZero : CGRectZero);
return 0;
}
使用不同的编译器进行测试会产生以下结果:
$ llvm-gcc -c test.m
test.m: In function ‘main’:
test.m:24: error: assignment of read-only variable ‘prop.76’
test.m:25: error: assignment of read-only variable ‘prop.77’
test.m:26: error: assignment of read-only variable ‘prop.78’
$ clang -c test.m
$
您可以使用LLVM或在特定情况下避免使用点语法。您可能想提交一个错误,但我不会屏住呼吸,因为Apple不太可能更新GCC。
答案 1 :(得分:0)
我在GCC 4.2,LLVM GCC 4.2和Apple LLVM 2.1下的通用通知方法上尝试了此代码。他们都没有给我错误。因此,Xcode安装和/或编译器安装正在进行中。