【问题标题】:Release pointer value to be used again?释放指针值以再次使用?
【发布时间】:2011-05-02 14:03:35
【问题描述】:

当使用下面的行时,我收到了 startTimer 和 stopTimer 时间戳之间的差异,完美。但我的问题是,我似乎无法释放/释放 startTimer 和 stopTimer 以便我可以再次将它们用作新值。有人可以帮忙吗?

基本上,在同一个视图中,我正在启动计时器,停止计时器,然后打印时差。然后我想用新的价值观重新开始整个过程​​。

startTimer = [[NSDate alloc]init];
stopTimer = [[NSDate alloc]init];
newTime = [NSString stringWithFormat:@"Time : %f", [stopTimer timeIntervalSinceDate:startTimer]];

我尝试使用:(但它们似乎不起作用)

[startTimer dealloc];
[stopTimer dealloc];

[startTimer release];
[stopTimer release];

startTimer = nil;
stopTimer = nil;

使用这些时,应用程序在我第二次使用时崩溃。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    如果需要,在再次分配/初始化对象之前,您只需致电 release 放弃您对相关对象的兴趣/所有权。

    就直接调用dealloc 而言,您应该永远不要这样做(除了在您创建的任何 dealloc 方法的末尾调用 [super dealloc]; 时) ,因为有问题的对象可能仍在其他地方使用。 (这在您提供的示例中显然是不可能的,但这是一个很好的启发式观察。)

    老实说,我建议您仔细阅读 Memory Management Programming Guide,因为这将在未来获得回报。

    【讨论】:

    • 更正.. 你不应该调用 dealloc 除非调用 [super dealloc] :-)
    • 谢谢 - 我现在就试试这个!
    • 干杯,伙计们,我会读一读——我认为这已经解决了我的问题 :) 目前还没有出现奇怪的崩溃,并且应用程序按预期运行
    【解决方案2】:

    您不需要调用 dealloc。当对象的引用计数降至 0 时,它会在对象被释放后调用。

    [在这种情况下 - 在release 消息调用之后]

    【讨论】:

    • 不错 - 让我试试这个,我将在我的 resetUI 方法中创建发布者
    • 更具体地说,您不得自己致电dealloc。只有一个例外:您必须在自己的 dealloc 覆盖中调用 [super dealloc]
    • 一般来说,是的,当然。但是在这个特定问题的上下文中 - 不需要调用 dealloc - release 就足够了,因为当 refcount 下降到 0 时,运行时会自动调用 dealloc。
    【解决方案3】:

    您可以在分配和初始化计时器之后调用释放,在这种情况下,您将拥有更新的计时器。

    [startTimer release];
    [stopTimer release];
    startTimer = [[NSDate alloc]init];
    stopTimer = [[NSDate alloc]init];
    

    我想这会对你有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 2014-06-22
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多