0

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

声明变量/字段等的位置有什么区别?

选项 1(头文件)

@interface ViewController : UIViewController {
UIView *testView;
}

选项 2(头文件)

@interface ViewController : UIViewController
@property UIView *testView;

选项 3(实现文件)

@implementation ViewController {
UIView *testView;
}
@end
4

2 回答 2

1

没有真正的区别,因为它们都完成了相同的结果。但这里是细节:

选项 1 与选项 2:

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

@property (nonatomic, strong) UIView *yourView;

--

选项 2 与选项 3

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

除了如果您在实现文件 (.m) 中声明该属性,其他包含您的标头的人将看不到它,即它是“某种私有的”,没有什么区别。(有时称为“私有接口”)。事实上,它并不是真正私有的,因为仍然可以调用选择器(obj-c 的动态特性)。尽管如此,隐藏您的实现并仅公开头文件中真正需要的内容是一种很好的做法。

因此,将选项 3用于内部内容,将选项 2用于外部内容。

于 2013-02-15T23:00:32.230 回答
0

选项 1:这是一个成员字段,没有属性访问器(即 getter/setter)。您必须将其访问为someInstanceOfViewController->testView(尽管在's 的实现中,这可能会因为隐式ViewController而缩短)。testViewself

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

选项 3:私有属性,所有行为都与选项 #2 相同,但编译器强制要求只能从实现文件内部访问。

于 2013-02-15T22:57:57.767 回答