CocoaObjective-C中的内存管理单元测试

CocoaObjective-C中的内存管理单元测试,第1张

概述你将如何编写一个单元测试 – 例如使用 OCUnit – 以确保对象在Cocoa / Objective-C中正确释放/保留? 一个简单的方法是检查retainCount的值,但是当然是you should never use retainCount.你能简单地检查一个对象的引用是否被赋值为nil来表示它已经被释放了?另外,对于实际释放对象的时机,您有什么保证? 我希望一个简洁的解决方案只有几行代 你将如何编写一个单元测试 – 例如使用 OCUnit – 以确保对象在Cocoa / Objective-C中正确释放/保留?

一个简单的方法是检查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中的内存管理单元测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1042528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存