【发布时间】:2016-05-21 06:54:08
【问题描述】:
以下代码运行良好,您可以在系统上运行以进行确认。
我的问题是,如您所见,dealloc 方法仅在保留计数达到零时调用,这意味着为 RetainTracker 对象释放了内存。但是,问题是当我在 dealloc 方法中记录保留计数时,它仍然显示保留计数为 1。这是为什么呢?
这是我的代码:
#import <Foundation/Foundation.h>
@interface RetainTracker : NSObject
@end
@implementation RetainTracker
- (id)init {
if (self = [super init]) {
NSLog(@"init: Retain count of %lu",(unsigned long)[self retainCount]);
}
return self;
}
- (void)dealloc {
NSLog(@"Dealloc called bye bye!==>%lu",(unsigned long)self.retainCount);
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
RetainTracker *myRetainTracker = [RetainTracker new];
[myRetainTracker retain]; // count-->2
NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);
[myRetainTracker release];// count -->1
NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);
[myRetainTracker retain];// count -->2
NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);
[myRetainTracker release];// count -->1
NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);
[myRetainTracker release];// count -->0
NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);
}
return 0;
}
这里是日志:
init: Retain count of 1
The retain count is ==>2
The retain count is ==>1
The retain count is ==>2
The retain count is ==>1
Dealloc called bye bye!==>1
The retain count is ==>1
【问题讨论】:
-
您想要做的不是打印保留计数,而是针对您的代码运行 ObjectAlloc 仪器,并打开引用计数(单击仪器的 (i) 并重新启动记录您的应用程序的仪器)。然后,您可以转到对象的特定实例,并获取它的完整保留/释放历史记录 - 这可以帮助确定是否有东西保留了不应该保留的对象。
标签: objective-c memory-management manual-retain-release