【问题标题】:Synthesized Properties and ivar error综合属性和 ivar 错误
【发布时间】:2012-05-15 14:59:31
【问题描述】:

我一直在“调试 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.

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

我在书中找不到任何我必须解释的内容。我做错了什么,或者更具体地说,我应该为“发布”编译修复这个问题吗?

谢谢!

【问题讨论】:

  • 好的,所以我刚刚找到了另一个似乎为主题增添了更多亮点的线程:stackoverflow.com/questions/7110245/… 我突然想到,虽然我有一台 64 位机器,但我正在运行 OS 10.6。 8……这和它有关系吗?编译器会尝试在 32 位模式下编译吗?
  • 我可能在这方面做得更好,但我怀疑我知道如何解决它,尽管我需要一些确认。我找到了这个线程:stackoverflow.com/questions/10043624/…,我肯定没有在接口部分声明实例变量,目前看起来像这样:@interface DBContactRecord : NSObject { } 我将尝试下一个,但如果有人可以确认,这将是最有帮助的:)
  • 您的 Xcode 项目的构建设置将告诉您是构建 32 位 (i386) 还是 64 (x86_64)。顺便说一句,没有“Xcode 3.6”之类的东西。
  • 深夜错字...我正在运行 Xcode 版本 3.2.6 :)

标签: cocoa compiler-construction properties ivar synthesize


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果变量名称与属性名称相同,则无需显式指定变量名称。最好不要将其改为:将变量命名为 _company,这样您就不会因为忘记 self. 而意外引用它而不是属性。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果您只想发布,但不想为“旧”运行时限制而烦恼,请在构建设置中禁用 32 位架构。 (实际上,“新”运行时终于有了,自 1991 年以来在 IBM SOM 中实现,所以“旧”和“新”在 Objective-C 运行时是非常相关的,但这是另一回事。)

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2012-01-18
      相关资源
      最近更新 更多