我已经在我的应用程序中添加了一个MKMapView,但是当我将地图分配到内存时,它的保留计数为2(我使用的是iOS 4.0作为基础SDK)
MKMapView *x = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 370)];
NSLog(@"map retain count: %i", [x retainCount]);
[self addSubview:x];
NSLog(@"map retain count: %i", [x retainCount]);
[x release];
NSLog(@"map retain count: %i", [x retainCount]);
[x removeFromSuperview];
NSLog(@"map retain count: %i", [x retainCount]);
输出显示此结果
2011-04-21 14:09:06.159 xx[7373:207] map retain count: 2
2011-04-21 14:09:06.159 xx[7373:207] map retain count: 3
2011-04-21 14:09:06.159 xx[7373:207] map retain count: 2
2011-04-21 14:09:06.160 xx[7373:207] map retain count: 1
保留计数在最后一个日志右边应为0? 或者它是否使用api已经创建的预定义对象?
答案 0 :(得分:4)
你不应该依赖retainCount
,因为有可能通过iOS保留你的对象,
请阅读 Apple 对retainCount
所说的内容。
重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法
要了解您必须遵守的内存管理的基本规则,请阅读“内存管理规则”。要诊断内存管理问题,请使用合适的工具:
LLVM/Clang
静态分析器通常可以在运行程序之前发现内存管理问题。
Instruments应用程序中的Object Alloc仪器(参见仪器用户指南)可以跟踪对象分配和销毁。
鲨鱼(参见Shark用户指南)还会描述内存分配(在程序的许多其他方面)。
答案 1 :(得分:0)
不要看保留计数,你会感到困惑。坚持遵循内存管理规则并假装保留计数不存在。
乐器是否说它在泄漏?
答案 2 :(得分:0)
如果你不看retainCount
试图了解内存管理,那么这将是一个很好的世界。 Memory Management上的Apple参考资料可以帮助您。不要担心retainCount
是什么;只需确保释放您拥有所有权的对象,并且不释放您不拥有的对象。请看Object Ownership
答案 3 :(得分:0)
保留计数记忆模型的重点是你只担心自己的责任,其他对象只担心他们的责任。如果您正在查看-retainCount,那么您对其他对象正在做的事情做出(可能无效的)假设。
那就是说,你所看到的原因是其他一些对象也保留了地图视图。这可能是地图视图本身,或者您不了解的某个内部地图视图管理器,或其他内容。