[英]NSData & NSMutabledata. How do I read from within the body of a data object?
[英]NSMutabledata. Why is the retain count 1 higher that I would have expected?
我每天都要使用牙线,锻炼身体,并确保在保留和释放之间保持平衡。
这就是我的困惑。 我有一个ivar:
NSMutabledata *_alignmentData
以及与此相关的综合属性:
// .h file
@property (nonatomic, retain) NSMutableData *alignmentData;
// .m file
@synthesize alignmentData=_alignmentData;
我开始异步地从服务器提取数据:
self.connection =
[[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];
并在分配数据缓冲区后立即在异步回调中使用:
// This prints 0. Cool.
NSLog(@"BEFORE [_alignmentData retainCount] = %d", [_alignmentData retainCount]);
// Create a place to receive the data that will arrive asynchronously:
self.alignmentData = [NSMutableData data];
// This prints 2. Shouldn't this be 1 ?!?
NSLog(@" AFTER [_alignmentData retainCount] = %d", [_alignmentData retainCount]);
为了使在上述self.alignmentData分配之后触发的第一个异步回调中的问题复杂化,我再次检查了保留计数:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
// This prints 1.
NSLog(@"[_alignmentData retainCount] = %d", [_alignmentData retainCount]);
[self.alignmentData setLength:0];
}
因此,似乎保留计数从0增加到2,然后下降到1。有人可以向我解释这是怎么可能的吗?
注意:有人告诉我不要将保留计数用作调试辅助工具,但这在非垃圾收集语言(例如Objective-C)中根本不可行。
从《 内存管理编程指南》中 :
保留计数
通常,没有理由明确询问对象的保留计数是多少(请参见keepCount )。 结果通常会产生误导,因为您可能不知道哪些框架对象保留了您感兴趣的对象。 在调试内存管理问题时,您只应确保代码符合所有权规则。
我从来没有遇到过查询对象的keepCount有用的情况。 如果您遵循适当的内存管理规则,则可以。
至于您的实际问题,自动发布不会立即发生。 每当当前自动释放池被弹出时,它们就会发生。 由于您没有显式管理任何自动释放池,因此您无法控制何时自动释放。 但是,由于您似乎遵循了正确的内存管理规则,因此您无需担心。
切勿使用保留计数作为调试辅助。 实际上,经验丰富的Objective-C编码人员会告诉您不要注意保留计数。 通常,担心它们的人是Objective-C的新手,就像您一样,他们一头雾水。
您不必担心保留数。 保留的东西比您期望的多的事实不一定与您的代码有任何关系,也不一定表明存在错误,并且确定哪种情况的唯一方法是使用建议的正确调试工具首先要做。
在此特定情况下,2是该对象在该时间点的正确保留计数,因为它是用保留计数1创建的,然后由您的setter方法保留。
也许是因为您要分配的对象的计数为+1,并且会自动释放,然后将其设置为一个属性,该属性将对其调用一个keep,即+2,并且原始对象会自动释放,因此它降至+1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.