iOS实例变量

时间:2014-08-29 14:49:52

标签: ios objective-c

简单的问题,我只想听听别人做了什么,以及最佳做法。澄清一些事情。

在我的一个视图控制器中声明实例变量时。宣布它的适当场所在哪里?我希望实例变量可用于视图控制器中的所有方法/函数

我已经在.h之后的花括号的@interface文件中看到了这种方式:

@interface ViewController : UIViewController {
    NSString *test3;
}

我已经在.m之后的花括号的@interface文件中看到了这种方式:

@interface ViewController () {
    NSString *test1;
}

我已经看到它以这种方式完成,在.m之后的花括号的@implementation文件中:

@implementation ViewController {
    NSString *test2;
}

最佳做法是什么?有什么区别吗?如果是这样的话,它们会是什么样的,哪种方式比另一种更好?

所有帮助将不胜感激, 感谢。

1 个答案:

答案 0 :(得分:3)

其中任何一个都可行,但目前的最佳做法是使用属性。如果您希望只能在班级内访问它:

@interface ViewController ()

@property (copy, nonatomic) NSString *test1;

@end

像这样访问:

self.test1 = @"Hello, world";

但是,如果您希望其他类也可以访问它,请将其放在公共接口中:

@interface ViewController : UIViewController

@property (copy, nonatomic) NSString *test1;

@end

然后像这样访问它:

someInstanceOfViewController.test1 = @"Hello, world";

如果您需要直接访问实例变量(在大多数情况下这仅适用于类内),例如,如果您要创建自定义setter,编译器将自动合成一个ivar,它是您的属性的名称前缀为下划线:

- (void)setTest1:(NSString *)test1
{
    _test1 = [test1 copy];
}

注意:copy是因为您可能会将test1设置为NSMutableString的实例,并且您可能不希望其内容从您的下方变异。如上所述,当您覆盖setter时,您必须自己强制执行此copy语义。