声明字段/变量的区别

时间:2013-02-15 22:52:04

标签: ios ios5 uiview

简单的问题,因为我是IOS的新手。

声明变量/字段等的位置有什么不同。

选项1(标题文件)

@interface ViewController : UIViewController {
UIView *testView;
}

选项2(标题文件)

@interface ViewController : UIViewController
@property UIView *testView;

选项3(实施文件)

@implementation ViewController {
UIView *testView;
}
@end

2 个答案:

答案 0 :(得分:1)

没有真正的区别,因为它们都能达到同样的效果。但这里有详细信息:

选项1与选项2:

声明iVar是多余的,因为属性会为您创建。属性的主要工作是自动创建访问器方法(setX和getX),并且可以进一步定义如何访问它们(原子或非原子)或如何将值存储在内存中(简单地像任何ivar一样分配?强或弱?)。我的建议是你忘记了选项1,并始终坚持选项2,例如

@property (nonatomic, strong) UIView *yourView;

-

选项2与选项3

(让我们跳过你的选项3是另一个iVar的事实,并假设你在这里声明了@property,因为它更有趣)

除了在您的实现文件(.m)中声明属性之外没有区别,包含您的标题的其他人将不会看到它,即它是“私有”。 (有时也称为“私有接口”)。事实上,它并不是真正私有的,因为人们仍然可以称之为选择器(obj-c的动态特性)。不过,最好隐藏您的实现,只展示头文件中真正需要的内容。

因此,对内部资料使用选项3 ,对外部资料使用选项2

答案 1 :(得分:0)

选项1:这是一个成员字段,没有属性访问者(即getter / setter)。您必须以someInstanceOfViewController->testView的形式访问它(尽管在ViewController的实现中,由于隐式testView),因此可以缩短为self

选项2:这是一个公共获取/设置属性,这意味着您可以使用someInstanceOfViewController.testView访问它。您可以自定义有关属性的getter / setter方法的一些内容。最常用的是readonlyretain(意味着如果将该属性设置为某个对象,则自动生成的setter方法会自动保留该对象,并释放该属性包含的旧对象)和assign(没有自动保留/释放语义)。声明属性后,您可以使用自动生成的getter / setter,也可以通过实现-(UIView *)testView(getter)和/或-(void)setTestView:(UIView *)testView编写自己的getter / setter。

选项3:一个私有属性,所有行为都作为选项#2,但编译器强制只能从实现文件中访问它。