在哪里放置局部变量

时间:2009-07-05 04:21:55

标签: iphone objective-c cocoa cocoa-touch

我可以通过视图控制器中的加速度计更新来查看谁的方法。我需要多个方法来使用和更改某些变量,例如,一个方法初始化变量,另一个方法用每个加速更新更新它们的值。

我知道如果它们只用在一个方法上我可以在那个方法中声明它们并且没问题。但是因为它们在多种方法中使用,所以我一直在实现文件的顶部声明它们,但不是我认为相信是错误的静态。在Apple的一些示例代码中,他们总是在接口文件中声明这些代码。这样做的最佳方法是什么?为什么?

我目前的方法:

@implementation

int foo;

备选方案1:

@implementation

static int foo;

备选方案2:

@interface {

int foo;

谢谢,

2 个答案:

答案 0 :(得分:8)

如果仅对单个方法的单次运行需要变量,则在方法内声明它们。每次输入方法时都需要初始化它们。这是线程安全的。

如果仅在单个方法中需要变量,但您希望它们在调用之间保持其值,请在方法中将它们声明为静态。它们被初始化为nil / 0 / false,或者您可以在声明中初始化它们。这不是线程安全的。

如果变量需要由单个实现文件中的任何方法或函数访问,并且您只需要一个用于整个程序,则将它们声明为.m文件中的静态变量。将它们声明为静态会阻止它们被链接器导出并与其他同名的全局变量冲突。它们默认初始化为nil / 0 / false,或者您可以在声明中初始化它们。这不是线程安全的。

如果变量需要通过对象中的任何方法访问,并且每个实例都需要自己的值,那么您需要一个ivar,在{}之间的接口中声明它。它们被初始化为nil / 0 / false。您无法在声明时将它们初始化为任何其他值。您可以在对象的init中初始化它们。如果仅从单个线程访问该对象,则这是线程安全的。

答案 1 :(得分:1)

Objective-C中的类与C ++中的类类似:该类分为两个文件。带有@interface块的头文件定义了类中可用的方法和所有类变量。带有@implementation的另一个文件提供了这些方法的实现。这有点遗留 - 在“旧时代”,编译器可以使用头文件进行优化。像Java这样的现代语言不会以这种方式破坏类,所以最初可能会让人感到困惑。

要声明类的成员变量,应将它们添加到.h文件中定义的@interface。这是一个示例.h文件,显示了一个用几个实例变量定义的类:

#import <Foundation/Foundation.h>
#import "PaintViewAnimation.h"
#import "Transforms.h"

@interface PaintViewZoomAnimator : NSObject {

    int                     valueIndex;
    Transforms              target;
    AbstractPaintView *     view;
}

- (id)initWithView:(AbstractPaintView*)v targetTransforms:(Transforms)t;

- (void)start;
- (BOOL)step;
- (void)finish;

@end

这是在Objective-C中声明类的成员变量的唯一方法。 PaintViewZoomAnimator的每个实例都有三个可供其所有方法访问的变量:valueIndex,target和view。您可以在其他地方说“int foo”,因为Objective-C实际上只是C上的一个薄层 - 但其他方法不正确。

您可以按照建议声明静态变量,但这会显着改变变量的范围。如果我在头文件中声明了一个静态变量,那么该变量随处可见(假设您包含或导入包含该定义的头文件),并且只有一个副本。如果我有两个PaintViewZoomAnimators,它们将共享静态变量的相同值。这不是一个很好的面向对象的练习,所以你应该尽量避免使用它。

希望有所帮助!如果你想开始使用Objective-C,我会推荐Aaron Hillegass的Cocoa书 - 它可以帮助你做这样的事情。