【问题标题】:Declaring instance variables in iOS - Objective-C在 iOS 中声明实例变量 - Objective-C
【发布时间】:2013-05-12 10:21:54
【问题描述】:

好的,这些天我已经阅读了很多关于这个主题的文章,但我总是感到困惑,因为我每次搜索的答案都不同。

我需要知道在 iOS 中声明实例变量的最佳方式。到目前为止,我知道我应该只在 .m 文件中声明它们并让 .h 保持干净。但我做不到:编译器给了我编译错误。

这里是一些仅来自 .m 的代码。

@interface UIDesign ()

// .m file
{
    NSString *test2 = @"test2";
}

@property (nonatomic, assign) int privateInt;

@end

@implementation UIDesign
{
    NSString *test1 = @"test1";
}

两个字符串都被错误地声明了,我不知道为什么。编译器说:expected ';'在声明列表的末尾

所以问题是:如何声明实例变量?我只需要在课堂上使用它们。

【问题讨论】:

  • 我的朋友,变量声明与定义不同。在这里,您正在声明的位置初始化一个变量。

标签: objective-c variables instance


【解决方案1】:

您不能初始化实例变量。它们都被初始化为零或零。所以编译器在你写等号时需要一个分号。

您可以在 init 方法中初始化它们。

【讨论】:

  • 我没有初始化方法。我应该做一个只是为了正确设置变量的值吗?
  • 如果你想初始化它们是的。你有。
  • 我认为您不必必须,但您可以。例如,您可以使用(void)viewDidLoad 方法来存储您的初始化行。因为这个方法是在视图加载时调用的(据说……)。就我自己而言,我很少在一些 viewController 中编写自己的 init 方法,除非我真的有很多变量。在 iOS 中,我只是使用 viewDidLoad 方法来初始化我的变量。
  • 这个类不是 ViewController。这只是我实现的一个类,以帮助我回收一些代码。
  • 除了 -init 的其他动机......(init 上的参数,即)您可以通过以下结论做出决定:1)RTE 自动将所有 ivars 设置为 0 的表示(NULL、nil、无, 0, 0.0)。 2) 你不应该因为 1) 将 ivar 设置为 0 的表示。 3) 如果您没有 ivar,则设置为表示 0 以外的值(并且没有其他初始化代码,如注册 $whereever),-init... 将为空 = 无用。反之亦然:如果您最初必须将 ivar 设置为表示 0 以外的其他值,请添加 -init…
【解决方案2】:

您正在尝试将实例变量添加到不受支持的类扩展或类别。 [编辑 2013-05-12 06-11-08:支持类扩展中的 ivars,但不支持类别。] 作为替代方案:

@interface UIDesign : NSObject
@end

@interface UIDesign ()

@property (nonatomic, assign) int privateInt;
@end

@implementation UIDesign

@synthesize privateInt = _privateInt;

- (void)someMethod {
    self.privateInt = 42;
}

@end

另一方面,如果你只是想在实现中声明一个实例变量,就在那里做吧:

@implementation UIDesign {
    int _privateInt;
}

@end

编辑: 刚刚注意到您还尝试在声明中初始化实例变量,这也是不受支持的。所以:

@interface UIDesign : NSObject
@end

@implementation UIDesign {
    NSString *_test;
}

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _test = @"Foo";

    return self;
}

@end

【讨论】:

  • 我没有初始化方法。我应该做一个只是为了正确设置变量的值吗?
  • 视情况而定。如果您的类的正常运行取决于 ivar 的初始值,那么可以。
  • 不再需要合成
  • 支持在类扩展中添加 Ivar。
  • 是的,当然。我的错。在类扩展中,但不在类别中。已编辑。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2013-02-02
相关资源
最近更新 更多