Objective c 用相同大小的另一个对象覆盖内存中某个对象的位置会导致ARC内存泄漏吗?

Objective c 用相同大小的另一个对象覆盖内存中某个对象的位置会导致ARC内存泄漏吗?,objective-c,memory-leaks,memcpy,Objective C,Memory Leaks,Memcpy,我当前正在用另一个约束覆盖一个约束,方法是直接写入它在内存中占用的空间。代码如下: memcpy((__bridge void*)constraint, (__bridge const void*)constraintClone, malloc_size((__bridge const void *)constraint)); (我想这样做的原因在这里解释:) 所以我的问题是:当Utilig ARC时,这会导致内存泄漏吗?如果是,我如何修复它?这不安全 一个对象可以做一些事情,比如有一个实例变

我当前正在用另一个约束覆盖一个约束,方法是直接写入它在内存中占用的空间。代码如下:

memcpy((__bridge void*)constraint, (__bridge const void*)constraintClone, malloc_size((__bridge const void *)constraint));
(我想这样做的原因在这里解释:)

所以我的问题是:当Utilig ARC时,这会导致内存泄漏吗?如果是,我如何修复它?

这不安全

一个对象可以做一些事情,比如有一个实例变量作为指向它自己实例数据的指针(例如,它可能有一个循环缓冲区的数组,其中指向该数组的指针用于当前读写位置)。这样的指针将继续指向源对象,而不是目标对象

被覆盖对象持有的所有强引用都将丢失(泄漏)。源对象持有的所有强引用将加倍,而被引用对象上的保留计数不会相应加倍。这将导致最终的过度释放


坦白地说,只需考虑“piml”成语,以及你的方法会如何破坏它。

< P> <强>不要这样做。<强> < /P> 不透明对象是不透明的,这是有原因的,您不知道在一般情况下复制它们的内存会做什么。充其量,泄露强引用对象和完全弄乱弱引用是可能的

避免出现需要此答案的情况。我已经为你的链接添加了一个答案


HTH

它将尝试
释放被覆盖的指针,这样它甚至可能崩溃。“你为什么要这样做?”格拉斯根达姆我在我的问题中回答了这个问题。我已经运行了好几次代码了,没有任何问题。所以我不认为崩溃会发生(除非发生崩溃需要满足一些罕见的条件),“为什么”是为什么要覆盖
IBOutlets
,而不是从代码创建对象并将其放在屏幕上。memcpy黑客可能有用,但它仍然是一个黑客。玩弄实现细节并不是真正的未来证明,它可能会随着iOS的任何小修订而改变。@grasGendarme链接的SO文章中正是回答了这个问题。我很乐意接受任何其他解决方案,但是,在我(在链接文章中)描述的非常特殊的情况下,我没有找到更好的解决方案。我对从代码中将对象放到屏幕上不感兴趣,因为这样会导致代码增加200%(或者更多,因为我使用的是autolayout)。我严格地把UI和代码分开,我不想放弃这个原则,因为我以前经历过“UI在代码中”的噩梦。对不起,我只是完整地阅读了链接。如果我理解正确,您将替换同一类的对象。这应该很好,因为它是完全相同的内存布局。您应该确保constraintClone具有与原始文件相同的
strong
指针,并且一切都应该正常工作。