Objective c 为什么:@property(copy)NSString*name没有内存泄漏,而我没有';不要在Dealoc中释放它?
我关闭了ARC。 我在一个类中声明了一个属性,如下所示:Objective c 为什么:@property(copy)NSString*name没有内存泄漏,而我没有';不要在Dealoc中释放它?,objective-c,memory-leaks,ios8,Objective C,Memory Leaks,Ios8,我关闭了ARC。 我在一个类中声明了一个属性,如下所示: @property(copy) NSString* name -(void)dealloc{ [super dealloc]; } 我用一个常量字符串设置name: [greeter setName:@"Jane"]; 我为我的类实现了dealloc,如下所示: @property(copy) NSString* name -(void)dealloc{ [super dealloc]; } 我预计会出现内存泄漏
@property(copy) NSString* name
-(void)dealloc{
[super dealloc];
}
我用一个常量字符串设置name
:
[greeter setName:@"Jane"];
我为我的类实现了dealloc
,如下所示:
@property(copy) NSString* name
-(void)dealloc{
[super dealloc];
}
我预计会出现内存泄漏,因为我没有释放name
。我使用的是Xcode 6.2,Product>Analyze
没有发现任何泄漏,仪器也没有:Product>Profile,选择泄漏,点击红色记录按钮
以下是相关代码:
//
// Greeter.h
// Flashlight2
//
#import <Foundation/Foundation.h>
@interface Greeter : NSObject
@property(copy) NSString* name;
-(NSString*)description;
-(void)dealloc;
@end
经过一段时间的思考,我能想到的唯一解释是,
名称设置器实际上并不复制常量字符串。似乎Obj-C对分配给属性的字符串进行了类型检查,因为它是一个常量字符串,所以Obj-C只将(?)指向常量字符串的指针分配给名称指针。是这样的吗?这里有两个优化在起作用,它们结合在一起导致了这个结果
第一:NSString文本存储在二进制文件的一个特殊段中,而不是在运行时分配。它们忽略保留和释放,并且从不分配或解除分配
第二:复制一个不可变的NSString(包括一个字符串文本)只是保留它,因为副本将保证始终与原始副本相同。(这是通过重写私有NSString子类中的-retain和-release方法实现的)
因此,在您的场景中,副本将变为保留,保留将被忽略,即使您在dealloc中正确释放了字符串,也不会发生释放。这与您的问题无关,但带有ios8标记,我假设您没有处理ARC之前的遗留代码,所以我很好奇您为什么要关闭ARC?@Rog,以了解内存管理。是的,这是我能想到的唯一一个好理由:)请随意探索NSString
内存管理特性,但要小心概括您的任何结论,因为NSString
是高度优化的,行为非常不典型。@Rob,好的。谢谢