我正在学习 ARC 内存管理并且遇到了一些对我来说没有意义的东西。
在下面的示例代码中,在 main() 中本地分配的对象在其指针分配给 nil 时被释放,正如我所期望的那样。
但是,如果在另一个函数中分配了相同类型的对象,并且在 main() 中定义了指向它的指针,并且该指针设置为 nil,则该对象在 main 函数退出之前不会被释放。这对我来说很神秘。
在下面的代码中,创建了 GRMemoryChecker 类的两个实例。在一种情况下,它直接在 main() 中分配,而在另一种情况下,main() 调用 itemMakerFunc() 进行分配。当您运行 main() 时,日志输出显示在函数中分配的实例在其指针设置为 nil 时没有被释放——它在函数退出时被释放。
我假设这意味着 itemMakerFunc() 创建的实例在指针设置为 nil 之前有 2 个所有者,而本地创建的实例只有 1 个。
但为什么?在指针设置为 nil 时,还有哪些其他所有者存在?或者如果没有其他所有者仍然存在,为什么计数器在它不存在时没有减少?
GRMemoryChecker.h:
#import <Foundation/Foundation.h>
@interface GRMemoryChecker : NSObject
{
NSString *name;
}
- (id)initWithName:(NSString *)str;
- (void)setName:(NSString *)str;
- (void) dealloc;
@end
GRMemoryChecker.m:
#import "GRMemoryChecker.h"
@implementation GRMemoryChecker
- (id)initWithName:(NSString *)str
{
self = [super init];
if (self)
{
[self setName:str];
}
return self;
}
- (void)setName:(NSString *)str
{
name = str;
}
- (NSString *)description
{
return name;
}
- (void) dealloc;
{
NSLog(@"Destroyed: %@", self);
}
@end
主.m:
#import <Foundation/Foundation.h>
#import "GRMemoryChecker.h"
GRMemoryChecker *itemMakerFunc()
{
return [[GRMemoryChecker alloc] initWithName:@"func-based checker" ];
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
GRMemoryChecker *checkerLocallyCreated = [[GRMemoryChecker alloc] initWithName:@"locally-created checker"];
GRMemoryChecker *checkerFuncBased = itemMakerFunc();
NSLog(@"Before setting func-based checker pointer to nil");
checkerFuncBased = nil;
NSLog(@"After setting func-based checker pointer to nil");
NSLog(@"Before setting locally-created checker pointer to nil");
checkerLocallyCreated = nil;
NSLog(@"After setting locally-created checker pointer to nil");
}
return 0;
}
控制台输出:
Before setting func-based checker pointer to nil
After setting func-based checker pointer to nil
Before setting locally-created checker pointer to nil
Destroyed: locally-created checker
After setting locally-created checker pointer to nil
Destroyed: func-based checker