【问题标题】:After updating to Xcode 6 many incompatible conversion assignment warnings / errors appeared更新到 Xcode 6 后出现许多不兼容的转换分配警告/错误
【发布时间】:2014-10-10 01:41:23
【问题描述】:

更新到 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
}

升级后出现了很多这样的警告。有没有人有类似的问题? 这不是一个局部问题,这个问题遍布整个项目。 我认为我的一些基础是错误的,或者是吗?

【问题讨论】:

  • 这很好,因为您可以使用指针了解何时
  • 还有YESNO,而不是TRUEFALSE。如果您正在编写 Objective-C,请使用 Objective-C 约定。也不再需要@synthesize。
  • 看来您需要一个现代教程。你关注的那个已经过时了。

标签: ios objective-c xcode ios8 xcode6


【解决方案1】:

并非所有 Objective 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。正如 cmets 中所指出的,在您的情况下,最好使用 instancetype 而不是 id,如 the docs 中所述。

【讨论】:

    【解决方案2】:

    我很确定你想这样做:

    头文件

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

    实现文件

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2020-11-26
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多