【问题标题】:When/where the arrow notation "->" should be used in Objective-C?在 Objective-C 中何时/何地应该使用箭头符号“->”?
【发布时间】:2013-03-15 18:26:06
【问题描述】:

我刚刚清楚地解释了“->”符号的含义:Dot (".") operator and arrow ("->") operator use in C vs. Objective-C

但我还是不明白 Objective-C 中这种表示法的真正用例是什么?

这是我正在谈论的示例:https://github.com/gnustep/gnustep-base/blob/master/Source/NSOperation.m - 为什么所有这些字符串,如 internal->lock 都写在那里 - 为什么不只使用 ivars 或点符号?


相关话题:Performance of object_setClass() instead of assigning isa pointer.

【问题讨论】:

  • 那个答案包罗万象,还有什么你想知道的>
  • @AnoopVaidya,引用的文章没有描述用例,尤其没有描述为什么一种表示法应该优于另一种表示法。我想,我确实在这里提出了有意义的问题。
  • 我的猜测是作者不想使用点符号来避免调用访问器方法的副作用 + 他们希望能够重新定义“内部”指针指向他们将来需要的任何东西,所以 ->正是提供了这种灵活性
  • @Vladimir,对不起,我不太了解您的“调用访问器方法的副作用”和“能够重新定义指向他们未来需要的任何东西的'内部'指针”。您能否在答案中格式化这些您的观点?我会很感激的!
  • 这些内部是一堆复杂的宏,用于为不同的编译器和配置实现非脆弱的东西。我觉得你最好看点别的。事实上,GNUstep 源代码是一个开始学习东西的坏地方,自从计算机运行缓慢以来,他们就竭尽全力优化东西。

标签: objective-c notation


【解决方案1】:

根据您的问题,不清楚您是否了解-> 运算符的作用。

GNUStep NSOperation 源代码中的那个例子使用了 ivar。这就是 -> 操作符所做的——它取消引用指针并访问命名成员。

至于“为什么不使用点符号?”显而易见的答案是他们不想通过访问器。通过访问器比直接访问要慢,并且在我们只是使用“哑”内部状态的这种情况下没有真正的好处。

那么什么时候应该在你的 Objective-C 代码中使用它呢?主要是当您通过指针访问结构时。很少需要直接访问另一个对象的实例变量。如果你这样做了,那代码就是例外,而不是规则。

【讨论】:

  • 感谢您的回答。很清楚。 “......如果你这样做,那代码是例外,而不是规则。”。你能解释一下,在什么样的情况下可能需要这样做? (我特别想知道,因为我自己很少需要直接访问 ivar,另请参阅 fx 如何“Github Objective-C 约定”建议:不要访问 ivar,除非您在 -init 或 -dealloc 等中)
  • @Stanislaw:我真的不知道我是否能比“特殊情况”更准确地解释哪里需要这样做。我有点想说“需要勉强发挥最后一点性能并且不希望发送消息的开销的情况”,但即使在这些情况下,通常也有更好的设计级优化可以做到这一点将消除需要。但这种情况经常会出现。
  • 我阅读了您的评论,因为我需要使用 -> “几乎从不”)))。谢谢。
  • 您可以经常在类方法中使用它来以更快的速度初始化分配的实例,即。无需调用 -init,尤其是因为类可以访问其实例的私有属性。
【解决方案2】:

可能是这种情况。我在苹果的Reachability.m文件中看到了一个例子。这里是:

@implementation Reachability
{
    SCNetworkReachabilityRef _reachabilityRef;
}

+ (instancetype)reachabilityWithHostName:(NSString *)hostName
{
    ...
    if (reachability != NULL)
    {
        returnValue= [[self alloc] init];
        if (returnValue != NULL)
        {
            returnValue->_reachabilityRef = reachability;
        }
        ...
    }
    return returnValue;
}

所以你可以用它来通过类方法中的对象调用全局变量。

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2016-09-04
    • 2016-11-15
    • 2014-07-05
    • 2014-03-20
    相关资源
    最近更新 更多