合成属性和ivar错误

时间:2012-05-07 03:39:45

标签: cocoa compiler-construction properties ivar synthesize

我一直在“Debug X86-64”模式(Xcode 3.6)中构建我的程序,一切都运行完美。但是,我只是尝试切换到“Release X86-64”模式,并在编译时收到了我的每个属性的以下错误:

Synthesized property 'x' must either be named the same as a compatible ivar or must
explicitly name an ivar.

其中'x'是我的一个属性,第一个是'公司'(我收到51个这种类型的错误。)。在我的.h界面文件中,我用这种方式列出了这些项目:

@property (copy) NSString   *company,
                        *address1,
                        *address2,
                        *city,
                        *usState,
                        *zip,
                        *phone,
                        *fax,
                        *email,
                        *web; // etc, etc.

在我的.M实现文件中,我将它们合成为:

@synthesize company,
        address1,
        address2,
        city,
        usState,
        zip,
        phone,
        fax,
        email,
        web; // etc, etc.

我的理解是实例变量是为这些属性自动创建的......实际上,它们似乎工作得很好,直到我尝试以“发布”模式进行编译。

我无法在书中找到任何解释这一点的内容。我做错了什么,或者更具体地说,我应该包含哪些内容来修复“发布”编译?

谢谢!

3 个答案:

答案 0 :(得分:1)

我相信我已在这里回答了我自己的问题。我已经做了两件事来纠正这些错误:

首先,我在接口文件中添加了实例变量声明。 其次,我将@Synthesize指令更改为:

@synthesize company = company;
@synthesize address1 = address1;
etc...

这修复了所有错误,并且在构建和发布模式下都能正确编译。

答案 1 :(得分:1)

还有另一种快速解决方案:在委托定义中添加这些属性

    @interface YourAppDelegate : NSObject <NSApplicationDelegate> {
      NSTextField * company;
      NSSlider * company;
         ...
     }

    @property (copy) NSString   *company,
                                *address1,
                                ... ;

答案 2 :(得分:0)

如果只想发布,但不想打扰“旧的”运行时限制,请在构建设置中禁用32位体系结构。 (实际上,“新”运行时终于从1991年开始在IBM SOM中实现,因此,在涉及Objective-C运行时时,“旧”和“新”是非常相关的。)