Objective c 为什么:@property(copy)NSString*name没有内存泄漏,而我没有';不要在Dealoc中释放它?

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]; } 我预计会出现内存泄漏

我关闭了ARC。

我在一个类中声明了一个属性,如下所示:

@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,好的。谢谢