【问题标题】:ObjC: using property and synthesize correctly? [duplicate]ObjC:正确使用属性和合成? [复制]
【发布时间】:2020-05-23 21:59:06
【问题描述】:

我正在尝试正确使用@property 和@sythesize,但遇到了这些错误。有谁知道这段代码有什么问题?这看起来应该如何使用,但编译不正确。

谢谢!

#import <Foundation/Foundation.h>

@interface A: NSObject

@property int a;

@end

@implementation A
int a;

@synthesize a;

@end

int main (int argc, char * argv[])
{
  @autoreleasepool {
    A *a = [[A alloc] init];

    [a setA:99];
    int v = [a getA];
    NSLog (@" %d\n", v);
  }
  return 0;
}

clang-7 -o a.out otest1.m -I `gnustep-config --variable=GNUSTEP_SYSTEM_HEADERS` -L `gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES` -lgnustep-base -fconstant-string-class=NSConstantString -D_NATIVE_OBJC_EXCEPTIONS -lobjc && ./a.out
otest1.m:12:13: error: synthesized property 'a' must either be named the same as a
      compatible instance variable or must explicitly name an instance variable
@synthesize a;
            ^
otest1.m:22:16: warning: instance method '-getA' not found (return type defaults to 'id')
      [-Wobjc-method-access]
    int v = [a getA];
               ^~~~
otest1.m:3:12: note: receiver is instance of class declared here
@interface A: NSObject
           ^
otest1.m:22:9: warning: incompatible pointer to integer conversion initializing 'int' with
      an expression of type 'id' [-Wint-conversion]
    int v = [a getA];
        ^   ~~~~~~~~
2 warnings and 1 error generated.
411 [debian:~/src/c]$ 

更新: 解决方案是 @synthesize 创建方法 setA 和 a。不是 setA 和 getA。我对此感到困惑,但这似乎是编译中的问题。我在 Mac OS Catalina 上使用 clang 并在 Linux 上使用 clang 测试了解决方案 here,它可以工作。

【问题讨论】:

  • @jtbandes 根据该帖子中的建议,我在实施部分声明了“int pa”,但错误仍然存​​在。
  • 或许可以试试_pa?还是@synthesize pa=pa;?顺便说一句,您的主要功能是错误的,您的意思可能是[a setPa:99] 而不是[A setPa:99]
  • @jtbandes 更新了代码,同样的错误。您是否认为这是名称空间冲突 re: _pa?
  • @Willeke 我无法输入 { int a; } 在用大括号实现。我必须把它放在没有大括号的实现下才能编译。

标签: objective-c


【解决方案1】:

定义名为a 的实例变量的正确语法是:

@implementation A
    {
        int a;
    }

    @synthesize a;

@end

然而,只有最新的 Objective-C 语言版本在实现中支持实例变量,并且仅在构建 64 位时才支持。老版本和32位只支持接口中的实例变量:

@interface A: NSObject
    { 
        @private
        int a;
    }

    @property int a;

@end

如果您在实现中根本不使用 @synthesize,那么非常新版本的 Objective-C 甚至会自动合成属性并且效果最好。

【讨论】:

  • 试过了,报错:int a指定的实例变量数不一致; ^
  • @notaorb 在这种情况下,您的 Obj-C 实现使用的语法比我预期的还要旧。最初一切都在接口中定义,后来对语言进行了修改以支持将大部分内容放入实现中,同时所有这些都由编译器在以后的版本中自动化。
  • 我在 Linux 上使用 clang。希望有人可以插话,可以在 Linux 上正确编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多