2014-08-29 120 views
3

简单的问题,我只想听听其他人做什么,以及最佳实践可能是什么。清理一些事情。iOS实例变量

当在我的一个视图控制器中声明一个实例变量时。哪里是适合申报的地方?我想实例变量,以提供给所有的方法在视图控制器/功能

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

@interface ViewController : UIViewController { 
    NSString *test3; 
} 

我已经看到它这样做的方式,在.m文件花括号中@interface后:

@interface ViewController() { 
    NSString *test1; 
} 

而后,我已经看到了这样做的方式,在.m文件在大括号:

@implementation ViewController { 
    NSString *test2; 
} 

什么是最佳实践?有什么区别吗?如果是的话,他们会是什么样的,什么使得一种方式比另一种更好?

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

回答

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"; 

如果您需要直接访问实例变量(并且这在大多数情况下仅适用于类内部),例如,如果您正在创建自定义设置器,编译器将自动合成作为属性名称的ivar前面加上下划线:

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

注:copy是因为你可以设置test1NSMutableString一个实例,你可能不希望从下你的内容得到了突变。当您重写setter时,如上所述,您必须自己执行此语义。

+0

那么目前的最佳做法是属性> iVars? – 2014-08-29 15:49:14

+0

你会发现分歧,但大多数风格指南走这条路。通常,合成的getter/setter方法调用引起的开销不明显。 – 2014-08-29 15:56:39