更新到Xcode 6后,出现了许多不兼容的转换分配警告/错误

时间:2014-10-10 01:41:24

标签: ios objective-c xcode ios8 xcode6

更新到Xcode 6后,许多不兼容的转换分配警告/错误开始出现

在.h文件中:

@property (nonatomic) BOOL *done;

在.m文件中:

@synthesize done;
- (id)init
{
if (self = [super init])
{
    self.done = FALSE;
}
return self;
}

- (void) crashed {
    self.done = TRUE;  #this line gives an incompatible type conversion warning
}

升级后出现了很多这些警告。有没有人有类似的问题? 这不是一个本地化的问题,这个问题遍布整个项目。 我以为我的一些基础是错的,或者是它?

2 个答案:

答案 0 :(得分:0)

我很确定你想这样做:

头文件

@property (nonatomic) BOOL done;  // Note: NOT a pointer

实施文件

- (instancetype)init {
    if (self = [super init]) {
        self.done = NO;
    }
    return self;
}

- (void)crashed {
    self.done = YES;
}

答案 1 :(得分:0)

并非所有目标C中的变量都必须使用*字符声明,因为该语言的一些新手认为。显示变量是指向对象的指针是C遗留物。像intBOOL这样的基本类型太简单了,不需要将它们存储在对象中的开销,因此使用了C风格的基元类型。来自the docs

  

标量类型用于您不需要的情况   使用对象的好处(或相关的开销)   代表一个价值。通常表示字符串   作为NSString类的实例,数值通常存储在   标量局部变量或属性。

BOOL是Objective C中的primitive data type,不应该是指针。警告是正确的。声明变量如下:

@property (nonatomic) BOOL done;

请注意变量名旁边没有*字符。其他原始类型(如intfloat)也应以类似的方式声明。

关于您的代码的其他一些事情。 BOOL值的正确Objective C约定是YES而不是TRUENO而不是FALSE,因此您应该坚持使用它。另外,从Xcode 4.4开始,除了一些特殊情况described here之外,您不需要@synthesize。正如评论中所指出的,如the docs中所述,在您的案例中使用instancetype代替id也更好。