为什么编译器看不到@synthesize和@dynamic?

时间:2011-08-05 00:15:35

标签: cocoa macos llvm clang

这不是新代码。它在OS 10.7 Lion / LLVM / Clang之前已成功编译和执行了数千次。

@interface CapDuring : NSObject {
    const char * iFileName;
...
}
@property(assign) const char * iFileName;
...
@property(readonly,getter=iFileName) const char * fileName;

!属性'fileName'需要定义方法'iFileName' - 使用@synthesize,@ dynamic或提供方法实现

...
@end


@implementation CapDuring
@synthesize iFileName;
...
@end

对于类似的每个声明都会重复此警告(即使使用了@dynamic)。

4 个答案:

答案 0 :(得分:3)

这里的行是@synthesize iFileName。那是不对的。你想要@synthesize fileName。你正在合成属性,而不是方法。该方法本身是作为合成属性访问器的过程的一部分生成的。

答案 1 :(得分:2)

@property(readonly,getter=iFileName) const char * fileName;
@synthesize iFileName;

表示有一个名为filename的属性,它将其getter命名为“iFileName”。

并且该属性确实没有合成

我想你想要做的是将iFileName的getter名称定义为“fileName”,即:

@property(readonly,getter=fileName) const char * iFileName;
@synthesize iFileName;

通过合成

为属性iFileName创建一个名为fileName的getter

答案 2 :(得分:1)

使用 @property(...)... iInstanceVariable 然后 @property(...,getter = iInstance)... instanceReference 进入一个单独的@interface(类别)开始给我带来问题。

最佳解决方案是:

@property(...)... instanceReference; @synthesize instanceReference = iInstanceVariable;

这不会在单独的类别中有效。

答案 3 :(得分:0)

通过将任何使用getter属性的属性移动到单独的@interface MyClass(myCompile)中,我解决了这个错误。

当通过getter / setter重命名OS属性/方法时,会出现同样的问题。

我通过取消重命名OS方法来解决这个问题。

感谢您提出的所有建议。