【问题标题】:The lifetime of instance of object in ObjCObjC中对象实例的生命周期
【发布时间】:2015-11-03 11:34:17
【问题描述】:

我仍然对指针和内存管理有点困惑(从 ObjC 和 Cocoa 开始)。让我想到的是这段代码:

double seconds = [[NSDate date] timeIntervalSince1970];

这是我的理解:

  1. 我从 NSDate 类的调用方法/消息中获得浮点类型的值
  2. 这个值被存储在变量seconds

我不明白我是在创建NSDate 对象(=NSDate 类的实例)吗?这个对象只是暂时的吗? 我一直认为创建一个对象并使对象持久化(至少在 ARC 介入或函数结束时它被销毁之前)的方法是创建一个指向它的指针。可能是这样的:

NSDate *now = [NSDate date];
[now timeIntervalSince1970] // get the value

这是否意味着在我的原始示例中,在堆上创建了一些未命名(没有变量指向它的变量)NSDate 实例,一旦它返回浮点值,它就会从堆中删除?

【问题讨论】:

    标签: objective-c memory-management heap-memory


    【解决方案1】:

    这是否意味着在我原来的例子中,有一些未命名的(没有 指向它的变量)在堆上创建的 NSDate 实例和 一旦它返回浮点值,它就会从堆中删除?

    是的,完全正确。

    当对象超出范围时,ARC 将删除它。

    即使在 ARC 之前,对象也会被创建为 autorelease,并在下一次通过事件循环(或当 最近的自动释放池被耗尽时)释放。

    【讨论】:

    • 好的,谢谢,我想安慰自己。现在我有另一个关于术语的问题。在我的第一段代码中,timeIntervalSince19709 是一个类方法吗?然后在我的第二段代码[now timeIntervalSince1970] 中使用实例方法?
    • 不,该方法是实例方法,这就是为什么您需要使用[NSDate date] 来创建实例。如果它是一个类方法,那么你会调用[NSDate timeIntervalSince1970]
    • 哦,我明白了,这是有道理的,因为我正在创建一个实例,但只是没有使用变量指向它。
    • 创建一个类方法对我来说确实有意义,而且效率会稍微高一些(因为不需要创建实例)。然而,它确实引入了另一种方法,因此使类稍微复杂化。这不是非黑即白; Apple 喜欢提供更少的方法,而 Microsoft 喜欢提供更多的方法(以通过 Unity 进入 C# 编程的人来说)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多