Yan*_*yer 4 objective-c autorelease objective-c-blocks
我写了一个类来声明性地描述一系列UIView动画.我的方法采用了一系列动画块并将它们放在一个数组中.所以在我的循环中我想这样做:
[animations addObject:[[block copy] autorelease]];
Run Code Online (Sandbox Code Playgroud)
我首先copy阻止它移动到堆中,允许它被retain数组所驱动.然后我自动释放它以放弃所有权(因为数组保留它).
但是,当动画数组被释放时,这会崩溃.(我的理解是引用的块已经被释放了.)
奇怪的是,这有效:
[animations addObject:[block copy]];
[block release];
Run Code Online (Sandbox Code Playgroud)
更新: - ......就像这样:
[animations addObject:[block copy]];
[block autorelease];
Run Code Online (Sandbox Code Playgroud)
为什么?我原本期望所有3个代码片段同样有效.任何解释?
例1:
[animations addObject:[[block copy] autorelease]];
Run Code Online (Sandbox Code Playgroud)
这是复制块,并自动释放副本.
例2:
[animations addObject:[block copy]];
[block release];
Run Code Online (Sandbox Code Playgroud)
这是复制块,然后释放原始块.如果您已经很好地处理了内存,这会导致您的原始块被过度释放(并且崩溃),并且您的副本被泄露.
例3:
[animations addObject:[block copy]];
[block autorelease];
Run Code Online (Sandbox Code Playgroud)
这是复制块,然后自动释放原始.请参阅前面示例中的注释.
那么,你的答案就是你的代码在其他地方做错了.解决这个问题,然后回到第一个例子.
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |