我是C ++的15年资深人士,我认为我可以轻松处理iPhone上的内存问题。但是我在几个回合中对这个新环境感到谦卑。这是我的问题。我希望我正确地提出这个问题。
基本上,我在appdelegate上保留了一个可变数组的公共对象。这似乎是维护多个不同视图使用的对象集合的合理位置。但是,在我创建视图并将视图推送到导航控制器以及视图开始使用这些值的时间之间,我创建对象的内存中的位置会被不同的值踩到。
我查看了所有代码,以确保引用计数准确但没有找到任何内容。所以我注释掉了所有“释放”调用,以保证对象仍然存在,但是踩踏仍在继续。
我的问题是...... 当我“推”一个可能导致我的记忆被踩到的视图时,我是否需要注意一些事情?我有一个用户按下的按钮,它将alloc-init一个viewcontroller,然后为包含的nav控制器做一个“pushViewController”。我在后续行验证我的对象是否已创建并跟踪内存。不幸的是,当按钮事件展开“PurpleEventCallback”时,内存会被踩踏。
这对任何人都有意义吗?我的视图中是否有一些不常见的东西导致我的记忆无效?
答案 0 :(得分:1)
欢迎来到SO!听起来你做的一切都是正确的。为了确保保留/释放不会导致问题,请在推动视图控制器之前再次尝试保留阵列结构。请记住,某些构造函数返回保留计数为1的对象,而其他构造函数返回保留计数为零的自动释放对象。作为一般规则,以“new”,“create”或“alloc”开头的所有函数都返回具有+1保留计数的对象。其他便利函数(如[NSMutableArray arrayWithCapacity:]
和[NSString stringWithFormat:]
)返回已自动释放且保留计数为零的对象。如果你保留一个指向这些对象的指针,它们将随着运行循环清理而随机消失。
您也可以使用“僵尸”技术调查。当您开始随机获取EXE_BAD_ACCESS
错误时非常有用。有关详细信息,请查看此页面:http://www.cocoadev.com/index.pl?NSZombieEnabled
从那篇文章开始:“......启用僵尸后,发送到解除分配对象的消息将不再表现奇怪或以难以理解的方式崩溃,而是记录消息并以可预测和调试器可破解的方式死亡这是尝试追踪过度释放和过早发布时使用的工具。“
希望有所帮助!
答案 1 :(得分:0)
您之前可能还没有读过Cocoa中自动释放池的概念。自动释放对象会将对象的释放推迟到当前事件循环的末尾(或者每当自动释放池耗尽时)。
要检查自动释放是否是您的问题,请将环境变量NSEnableAutoreleasePool
设置为"NO"
。如果问题消失,自动释放就是你的问题。