【问题标题】:When to release CATransition animation? (iphone)何时发布 CATransition 动画? (苹果手机)
【发布时间】:2009-09-29 22:10:03
【问题描述】:

我正在使用此代码制作动画

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.45f];
    [animation setType:kCATransitionPush];
    [animation setSubtype:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
    [[theWindow layer] addAnimation:animation forKey:@""];
    //[animation release];

我想我应该在完成动画对象后 [释放],但如果我这样做了,我会在 gdb 中得到一个 EXC_BAD_ACCESS

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) where
#0  0x93c38688 in objc_msgSend ()
#1  0x30506515 in NSPopAutoreleasePool ()
#2  0x305359f0 in __NSFireDelayedPerform ()
#3  0x302454a0 in CFRunLoopRunSpecific ()
#4  0x30244628 in CFRunLoopRunInMode ()
#5  0x32044c31 in GSEventRunModal ()
#6  0x32044cf6 in GSEventRun ()
#7  0x309021ee in UIApplicationMain ()
...

所以我猜我不应该发布动画。

谁能解释为什么会这样?我习惯于发布东西,这种情况是该规则的某种例外。有什么想法吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management


    【解决方案1】:

    您没有发布此动画,因为您没有分配、新建、复制或保留它。

    来自 Cocoa 内存管理基础:

    如果您使用名称以“alloc”或“new”开头或包含“copy”的方法(例如,alloc、newObject 或 mutableCopy)创建对象,或者向其发送保留消息。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。其他任何时候您收到物品时,都不得释放它。

    【讨论】:

      【解决方案2】:

      CAAnimation 正在自动释放,因为您使用的是 CAAnimation 的类方法。

      你不负责释放它,它会在runloop结束时自动释放。

      【讨论】:

      • 只是为了明确术语,OP调用“类方法”并不是为了消除调用释放的需要。它是特定类方法的名称。例如,alloc 也是一个类方法,从它返回的值必须被释放。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多