一个简单的方法是检查retainCount的值,但是当然是you should never use retainCount
.你能简单地检查一个对象的引用是否被赋值为nil来表示它已经被释放了?另外,对于实际释放对象的时机,您有什么保证?
我希望一个简洁的解决方案只有几行代码,因为我可能会大量使用这个。实际上可能有两个答案:一个使用自动释放池,另一个不使用。
为了澄清,我不是在寻找一种方法来全面测试我创建的每个对象。不可能单独测试任何行为,更不用说内存管理。至少,最好检查发布对象的行为以进行回归测试(并确保相同的内存相关错误不会发生两次)。
关于答案
我接受了BJ Homer的answer,因为我发现它是最简单,最简洁的方式完成我的想法,考虑到Automatic Reference Counting提供的弱指针在XCode的生产版本(在4.2之前)不可用的警告: 2011年7月23日。我也印象深刻,学习
ARC can be enabled on a per-file basis; it does not require that your
entire project use it. You Could compile your unit tests with ARC and
leave your main project on manual retain-release,and this test would
still work.
话虽如此,对于Objective-C中单元测试内存管理的潜在问题,我更强烈地推荐Peter Hosey的in-depth response。
解决方法 如果你可以使用新引入的自动引用计数(在Xcode的生产版本中尚不可用,但是在 documented here),那么你可以使用弱指针来测试任何东西是否被过度保留。- (voID)testMemory { __weak ID testingPointer = nil; ID someObject = // some object with a 'foo' property @autoreleasepool { // Point the weak pointer to the thing we expect to be dealloc'd // when we're done. ID theFoo = [someObject theFoo]; testingPointer = theFoo; [someObject setTheFoo:somethingElse]; // At this point,we still have a reference to 'theFoo',// so 'testingPointer' is still valID. We need to nil it out. STAssertNotNil(testingPointer,@"This will never happen,since we're still holding it.") theFoo = nil; } // Now the last strong reference to 'theFoo' should be gone,so 'testingPointer' will revert to nil STAssertNil(testingPointer,@"Something dIDn't release %@ when it should have",testingPointer);}
注意,这在ARC下工作,因为对语言语义的这种改变:
A retainable object pointer is either a null pointer or a pointer to a valID object.
因此,设置指向nil的指针的行为保证释放它指向的对象,并且没有办法(在ARC下)释放对象而不移除它的指针。
需要注意的一点是,ARC可以在每个文件的基础上启用;它不需要你的整个项目使用它。您可以使用ARC编译单元测试,并将主项目保留为手动保留 – 释放,并且此测试仍然可以工作。
上面没有检测到过度释放,但是这很容易赶上NSZombIEEnabled反正。
如果ARC根本不是一个选项,你可以做一些类似于Mike Ash的MAZeroingWeakRef
.我没有使用它,但它似乎提供类似的功能__weak指针以向后兼容的方式。
以上是内存溢出为你收集整理的Cocoa/Objective-C中的内存管理单元测试全部内容,希望文章能够帮你解决Cocoa/Objective-C中的内存管理单元测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)