NSMutabledata.为什么保留计数比我预期的要高1?

dug*_*gla 0 iphone release objective-c retain nsdata

我每天都在尝试使用牙线,进行锻炼,并确保在保留和释放之间保持平衡.

这让我感到困惑.我有一个伊娃:

NSMutabledata *_alignmentData 
Run Code Online (Sandbox Code Playgroud)

以及与之相关的综合属性:

// .h file
@property (nonatomic, retain) NSMutableData *alignmentData;

// .m file
@synthesize alignmentData=_alignmentData;
Run Code Online (Sandbox Code Playgroud)

我开始异步从服务器中提取数据:

self.connection = 
[[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];
Run Code Online (Sandbox Code Playgroud)

并在分配了一个数据缓冲区后立即在异步回调中使用:

// 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]);
Run Code Online (Sandbox Code Playgroud)

为了使在上面分配self.alignmentData之后触发的第一个异步回调中的问题复杂化,我再次检查保留计数:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    // This prints 1. 
    NSLog(@"[_alignmentData retainCount] = %d", [_alignmentData retainCount]);
    [self.alignmentData setLength:0];

}
Run Code Online (Sandbox Code Playgroud)

因此,似乎保留计数从0上升到2然后下降到1.有人可以向我解释这是如何可能的吗?

注意:我被告知不要使用保留计数作为调试辅助工具,但在诸如Objective-C之类的非垃圾收集语言中这是不切实际的.

Dav*_*ong 5

内存管理编程指南:

保留计数

通常,没有理由明确询问对象的保留计数是什么(请参阅retainCount).结果通常会产生误导,因为您可能不知道哪些框架对象保留了您感兴趣的对象.在调试内存管理问题时,您应该只关心确保代码遵守所有权规则.

我从来没有遇到过查询对象的retainCount有用的情况.如果你遵循适当的内存管理规则,你会没事的.

至于你的实际问题,自动释放不会立即发生.只要弹出当前的自动释放池,就会发生这种情况.由于您没有明确管理任何自动释放池,因此您无法控制何时发生自动释放.但是,由于您似乎遵循了正确的内存管理规则,因此您无需担心.


Chu*_*uck 5

实际上不使用保留计数作为调试辅助.事实上,它是经验丰富的Objective-C编码员,会告诉你不要注意保留计数.一般担心他们的人都是Objective-C的新手,他们最终会像你一样感到困惑.

你不应该担心保留计数.事物有更多的保留而不是你期望的事实并不一定与你的代码有任何关系,并不一定表示一个错误,唯一的方法来确定是哪种情况是使用适当的调试工具,就像你被建议的那样一开始就做.

在这种特殊情况下,2是该对象在该时间点的正确保留计数,因为它是使用保留计数1创建的,然后由您的setter方法保留.