【问题标题】:Dot notation confusion点符号混淆
【发布时间】:2015-12-06 02:29:14
【问题描述】:

在学习了一些 Objective-C 之后,我仍然对点符号感到困惑。

我了解在“setters”和“getters”中使用点表示法,我可以接受这部分。但是,当我没有设置或获取值时,我有使用_varableName 的习惯。我的代码中的一些示例:

.h文件:

@property (nonatomic,strong) LoginWindowController *loginWindow;
@property (nonatomic,strong) MainWindowController *mainWindowController;

.m文件:

_loginWindow = [[LoginWindowController alloc] initWithWindowNibName:@"LoginWindowController"];
[[_mainAppViewController view]removeFromSuperview];

我应该在上面的例子中使用点符号吗?出于某种原因,我没有看到使用 self.loginWindowself.mainAppViewController 的意义。

【问题讨论】:

  • 是的,因为您将来可能希望实现访问器方法
  • 对于类本身来说没什么大不了的,因为如果你实现了一个 getter 和/或 setter 并想使用它,你可以自己更改类。真正重要的是 子类 是否实现了 getter 或 setter。

标签: objective-c syntax


【解决方案1】:

最佳做法是在获取/设置属性时使用点表示法(init 方法除外。)

为什么?

使用点表示法(或 value/setValue:)强制执行属性属性(“非原子”和“强”位),而直接访问绕过它们。 KVO 还要求您使用该属性才能正常工作。

您不要在 init 方法中使用它,因为子类可能会覆盖这些方法并处理尚未正确初始化的代码。

【讨论】:

  • 所以在我发布的代码中,我应该在 mainWindowController 中使用点符号,但我可以使用 _loginWindow,因为我正在进行初始化。但是当我使用登录窗口时,我应该在下一行做什么?我应该在那里使用点符号吗?
  • 如果代码行 in 是一个初始化器,则使用直接访问。否则使用点符号。
【解决方案2】:

您感到困惑的原因是 ARC 正在为您管理内存。情况并非总是如此。

因此,在过去,访问器方法(这是属性和点符号真正为您提供的)在其中包含实际的内存管理代码。如果您绕过访问器并直接访问实例变量,那么当您搞砸内存管理时,您就会遇到麻烦,现在由您决定。因此,通常最好使用访问器/属性/点符号。

然而,现在 ARC 介入并为您提供强引用内存管理,即使您直接分配给实例变量也是如此。因此,即使这不是一个好习惯,惩罚也不是那么明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多