或者,为什么retainCount我的暑假没有使用
这篇文章的目的是征求关于臭名昭着的方法的原因和原因的详细报道retainCount,以巩固围绕SO的相关信息.*
基础知识:不使用的官方理由是什么retainCount?是否有过任何情况下都当它可能是有用的?应该做些什么?**随意编辑.
历史/解释:如果不打算使用Apple,为什么Apple在NSObject协议中提供此方法?Apple的代码是否依赖于retainCount某些目的?如果是这样,为什么不把它隐藏在某个地方?
为了更深入地理解:对象可能具有与用户代码假设不同的保留计数的原因是什么?您能否举例说明框架代码可能会使用哪些标准程序导致这种差异?是否有任何已知的情况,保留计数总是与新用户可能期望的不同?
你认为还有什么值得关注的retainCount吗?
*不熟悉Objective-C和Cocoa的编码人员经常努力解决或至少误解参考计数方案.教程解释可能提及保留计数,这(根据这些解释)当你打电话上去一个retain,alloc,copy由一个当你调用等,向下release(并在当你调用未来的某一时刻autorelease).
因此,一个崭露头角的可可黑客克里斯可以很容易地认识到,检查一个对象的保留计数对于解决一些内存问题是有用的,而且,有一种方法可用于每个被调用的对象retainCount!克里斯打电话retainCount给几个对象,这个对象太高了,而且这个对象太低了,到底发生了什么?!因此,Kris在SO上发帖,"我的记忆管理出了什么问题?" 然后一群<bold>,<large>字母下降说"不要那样做!你不能依靠结果.",这是好的,但我们的强悍编码器可能需要更深入的解释.
我希望这会变成一个常见问题解答,一个很好的信息论文/讲座的页面,我们的任何专家都倾向于写一个,当他们想知道时可以指出新的可可头retainCount.
**我不想让它过于宽泛,但是经验或有关验证/调试保留和释放配对的文档的具体提示可能适合此处.
***在虚拟代码中; 很明显,一般公众无法访问Apple的实际代码.
我曾经在调试器下使用[myVar retainCount]验证我的一些变量是否具有预期的保留计数,尤其是对于没有自定义dealloc的var.
你如何在ARC模式下这样做?你如何确保没有内存泄漏?
注意:我理解ARC应该为我处理这个问题,但生活远非完美,而在现实生活中,你有一些有时被第三方库分配的对象(使用retain?)并且永远不会被解除分配.
我这样做的图像:
MyObj *myObj=[[MyObj alloc] init];
Run Code Online (Sandbox Code Playgroud)
然后我打电话
[somethingElse doSomethingWithMyObj:myObj];
Run Code Online (Sandbox Code Playgroud)
后来,我做到了
myObj=NULL;
Run Code Online (Sandbox Code Playgroud)
如果我的程序工作正常,我的期望是myObj正在被销毁,但似乎并非如此......
那么我该如何跟踪这一点,特别是如果我没有管理的东西?
现在,关于工具:在我的mac(使用5 Meg)上运行内存工具似乎非常困难,无需重新启动mac并从头开始.这真烦人!即使在程序启动之前,仪器仍然会崩溃,那么是否有更改解决方案?
您将如何编写单元测试 - 例如使用OCUnit - 以确保在Cocoa/Objective-C中正确释放/保留对象?
一个天真的方法是检查它的价值retainCount,但当然你永远不应该使用retainCount.您是否可以简单地检查对象的引用是否被赋值nil以指示它已被释放?另外,您对实际取消分配对象的时间有什么保证?
我希望只有几行代码的简洁解决方案,因为我可能会广泛使用它.实际上可能有两个答案:一个使用自动释放池,另一个不使用.
为了澄清,我不是在寻找一种全面测试我创建的每个对象的方法.全面地对任何行为进行单元测试是不可能的,更不用说内存管理了.但至少,最好检查已发布对象的行为以进行回归测试(并确保相同的与内存相关的错误不会发生两次).
我接受了BJ Homer的答案,因为我发现它是实现我想到的最简单,最简洁的方法,但需要注意的是,在XCode的生产版本中,提供自动引用计数的弱指针是不可用的.从2011年7月23日到4.2?)我也对这一点印象深刻
可以基于每个文件启用ARC; 它不要求整个项目使用它.您可以使用ARC编译单元测试并将主项目保留为手动保留释放,此测试仍然有效.
话虽如此,为了更详细地探讨Objective-C中单元测试内存管理所涉及的潜在问题,我强烈推荐Peter Hosey的深入回应.
我在ARC引用计数方面有点混乱你可以告诉我下面的波纹管代码的参考数量.
var vc1 = UIViewController()
var vc2 = vc1
var vc3 = vc2
weak var vc4 = vc3
Run Code Online (Sandbox Code Playgroud)
问题是:
有没有办法快速将对象的保留计数注销到Xcode的控制台?如果没有,那么下一个最佳选择是什么?
我对内存管理技术的要求还不是很高,并且想知道是否有人可以向我解释这种奇怪的行为.考虑一下我测试的这3段代码:
DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
NSLog(@"dof retain count = %d", [dofView retainCount]);
Run Code Online (Sandbox Code Playgroud)
此日志:保留计数= 1.这很好.
DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[dofView release];
NSLog(@"dof retain count = %d", [dofView retainCount]);
Run Code Online (Sandbox Code Playgroud)
这个日志:保留计数= 1.不应该是0 ??
DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
NSLog(@"dof retian count = %d", [dofView retainCount]);
Run Code Online (Sandbox Code Playgroud)
这个日志:保留计数= 5.我不知道为什么它的五个?
任何人都对此有所了解吗?我担心每次创建新视图时我都会吃掉内存.
谢谢!
for(UIView *subview in [scrollView subviews]) {
NSLog(@"subviews Count=%d",[[scrollView subviews]count]);
//[subview release];
[subview removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)
在上面的方法,如果我使用 [subview removeFromSuperview];它工作正常...但如果我使用[subview release];它崩溃.. 我
想知道,如果两者相同或它们之间有什么区别?
有人知道在调试模式下如何检查对象的保留计数?我试图添加一个表达式,[objInstance retainCount]但它没有用.我也在控制台中尝试了打印对象 PO [objInstance retainCount],但它再次无效.
这是SO中已经回答的问题,但我无法在Apple文档中找到它.你能指出我正确的方向吗?
在以下主题中
在将对象传递给-performSelector之前,我是否必须保留一个对象:withObject:afterDelay:?
对performSelector的保留计数的影响:withObject:afterDelay:inModes
是调用performSelector的对象:withObject:afterDelay是否被NSRunLoop保留?
默认行为似乎如下:它保留接收器和参数.
我正在使用以下代码
[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];
Run Code Online (Sandbox Code Playgroud)
哪里userData是自动释放的对象.
记录保留计数(我知道它可能无效)传入的数据会增加其保留计数.在委托上调用方法时,保留计数不等于1.
所以,我的问题是:我是否需要执行一些内存管理以避免泄漏或者我是否必须相信Apple的东西?在这里,我作为一个不可知论者说话,因为我找不到合适的文档.
先感谢您.
memory-management objective-c retain nsobject performselector
我正在制作iPhone游戏.我想释放已分配或保留的所有对象.在dealloc我发布所有这些对象的函数中,但后来我意识到有时候我还没有分配对象时最终释放对象.所以我想retainCount在发布它之前我需要检查它是否大于零.
我的问题是:
我只是检查是否retainCount大于零,然后释放它?
if([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
要么
我应该多次发布它 retainCount
while([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
iphone ×6
objective-c ×6
ios ×5
retain ×3
retaincount ×3
cocoa ×2
swift ×2
debugging ×1
nsobject ×1
ocunit ×1
reference ×1
uiscrollview ×1
unit-testing ×1
xcode ×1