【问题标题】:Difference between where fields/variables are declared声明字段/变量的位置之间的差异
【发布时间】:2013-02-15 22:52:03
【问题描述】:

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

在哪里声明变量/字段等有什么区别?

选项 1(头文件)

@interface ViewController : UIViewController {
UIView *testView;
}

选项 2(头文件)

@interface ViewController : UIViewController
@property UIView *testView;

选项3(实现文件)

@implementation ViewController {
UIView *testView;
}
@end

【问题讨论】:

标签: ios ios5 uiview


【解决方案1】:

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

选项 1 与选项 2:

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

@property (nonatomic, strong) UIView *yourView;

--

选项 2 与选项 3

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 那么接下来,选项 2 在整个应用程序中公开可用,而选项 3 仅适用于该文件/类?
    • 正确。一个好的经验法则是将选项 2 用于可公开访问的属性,将选项 3 用于私有实现细节。保留/释放语义非常有用,您只会在极少数情况下使用选项 1。
    • 最后,同样的规则是否适用于所有声明的变量,如 UITextField、IBOutlets 等
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2013-12-06
    • 2010-09-22
    相关资源
    最近更新 更多