什么会导致块在圆弧下不保留参照的Objective-C对象?

什么会导致块在圆弧下不保留参照的Objective-C对象?,objective-c,automatic-ref-counting,objective-c-blocks,Objective C,Automatic Ref Counting,Objective C Blocks,我收到一份车祸报告,上面说: ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSMallocBlock\uuuu\CGImage]:未识别的选择器已发送到实例0x1fb17f90' 当一个对象被解除分配,而另一个对象现在与解除分配的对象位于同一地址时,通常会发生这种情况 这是我的代码(我的应用程序中唯一调用CGImage方法的地方): 我假设image对象应该由块自动保留(我使用的是ARC),这样image对象在默认优先级队列上

我收到一份车祸报告,上面说:

***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSMallocBlock\uuuu\CGImage]:未识别的选择器已发送到实例0x1fb17f90'


当一个对象被解除分配,而另一个对象现在与解除分配的对象位于同一地址时,通常会发生这种情况

这是我的代码(我的应用程序中唯一调用
CGImage
方法的地方):

我假设
image
对象应该由块自动保留(我使用的是ARC),这样
image
对象在默认优先级队列上执行之前就不能被释放。这次坠机似乎意味着它没有被保留


我的假设是错误的还是遗漏了其他内容?

这与ARC下的UIColor和CGColorRef的行为不一样吗?如下文所述:

因此,你有:

CGImageRef imageRef = [image CGImage];
我认为您需要在块中显式地保留它,然后显式地释放它,这样ARC就不会取消分配image ref

因此:


你的街区本身可能没有问题。有人称之为街区;调用方可能已经传递了一个解除分配的对象。我会在块的第一行做一个NSLog(@“%@”,image),并查看调用代码

这个代码是正确的。我只能想到两个可能性:1。崩溃发生在其他地方,而不是在此代码中。2.你的应用程序中出现了某种内存损坏。一些想法:1)在CGImage调用周围放置一个try/catch,看看你是否能捕获它?2) 在weakSelf.image=assignment之后才释放decompressed-dimageref。我在OS X上看到了一些CGImage例程和位图上下文的错误,在这些程序中,保留很短,图像数据是共享的(我认为是写时复制语义)。这闻起来可能是相关的。“这通常发生在一个对象被解除分配,而另一个对象现在与解除分配的对象位于同一地址的情况下。”如果您怀疑发生了这种情况,正确的测试方法是启用僵尸。如何声明成功阻止?如果存储块并在以后调用它,请确保该块是一个复制属性。我描述的问题是
image
被提前释放,而不是
imageRef
。iOS 5.1.x之后,“内部指针问题”已得到修复:“NS\u返回\u内部指针方法,该方法返回指针(而不是Objective C对象类型)已使用clang编译器属性objc_returns_inner_pointer(使用clang编译时)进行修饰,以防止编译器在返回的指针可能仍在使用时主动释放这些消息的接收器表达式,这些消息看起来不再被引用。”这也适用于从属性返回的CGImageRef。
CGImageRef imageRef = [image CGImage];
CGImageRef imageRef = CGImageRetain([image CGImage]);
...
CGImageRelease(imageRef);