0

我有MyUnitClass这样声明的实现:

@implementation MyUnitClass
Unit* _unit = NULL;

在 for 循环中,我迭代了多次并创建了多个 MyUnitClass 实例。 Unit表现得像一个静态变量。我在 init 方法中设置了一个断点MyUnitClass,这是每次初始化类时得到的:

(gdb) print _unit
$4 = (Unit *) 0x112340
(gdb) print _unit
$5 = (Unit *) 0x112340

笔记:

我已经通过将变量移动到@interface声明中解决了这个问题。如果您回答了这个问题,很高兴看到可以找到此信息的页面的链接。

4

2 回答 2

8

这是因为您没有用花括号将变量括起来,使其成为全局变量。要修复,请尝试像这样定义它:

@implementation MyObject {
   unsigned int myVar;
}

// rest of implementation

@end

只能有一个 @implementation 块,因此如果它已在 .h 文件中声明,则需要在此处添加成员,否则需要将整个块移动到 .m 文件中。

这是 C 的残余,编译器不太清楚您希望它成为 iVar,而不是全局变量。

于 2012-08-12T00:44:02.200 回答
3

正如理查德指出的那样,没有大括号将 var 定义为全局变量。在声明实例变量方面,有两种方法:

Objective-C 编程语言中,讨论了在@interface@implementation.

因此,您可以在 中定义一个实例变量,这是您历史上最常见的定义实例变量的地方x@interface

@interface TestClass : NSObject
{
    NSInteger x;
}
@end

@implementation TestClass

// define the methods

@end

但是,正如上面的链接描述的那样,您也可以在您的中定义它@implementation(尽管按照惯例,我认为您不会经常看到这种情况):

@interface TestClass : NSObject

@end

@implementation TestClass
{
    NSInteger x;
}

// define the methods

@end

实际上,您可以将实例变量放在第三个位置,在类扩展中(稍后在同一文档中讨论)。实际上,这意味着您可以将 .h 定义如下

// TestClass.h

@interface TestClass : NSObject

// define public properties and methods here

@end

和你的 .m 如下:

// TestClass.m

// this is the class extension

@interface TestClass ()
{
    NSInteger x;
}
@end

// this is the implementation

@implementation TestClass

// define the methods

@end

最后一种方法(带有 .h@interface的 .m 带有类扩展名和@implementation)现在是 Xcode 模板在您创建新类时使用的格式。实际上,这意味着您可以将公共声明放在 .h 文件中,并将私有@property和实例变量放在类扩展中。它只是让你的代码更简洁一些,避免你的 .h 文件(它实际上是你的类的公共接口)与私有实现细节混淆。对于实例变量,也许以前在 中定义实例变量的技术@implementation是等效的,但我认为这不适用于@property声明,在这种情况下,类扩展变得有用。

于 2012-08-12T07:23:43.800 回答