Objective c 释放已处理的NSString会导致崩溃
注意注释掉的Objective c 释放已处理的NSString会导致崩溃,objective-c,cocoa,memory-management,nsstring,Objective C,Cocoa,Memory Management,Nsstring,注意注释掉的[printvolfirst release]下面的行。如果我取消评论,程序就会崩溃。我不明白为什么。printvolfirst变量除了在这里看到的代码行中之外,不会在其他任何地方使用。在它被分配到printvol之后,我就完成了。那为什么不发布呢 vol = vol / 1000000; NSNumberFormatter * format = [[NSNumberFormatter alloc] init] ; [format setPositiveFormat:@"#.#"];
[printvolfirst release]代码>下面的行。如果我取消评论,程序就会崩溃。我不明白为什么。printvolfirst
变量除了在这里看到的代码行中之外,不会在其他任何地方使用。在它被分配到printvol
之后,我就完成了。那为什么不发布呢
vol = vol / 1000000;
NSNumberFormatter * format = [[NSNumberFormatter alloc] init] ;
[format setPositiveFormat:@"#.#"];
NSString * printvolfirst = [[NSString alloc]init];
printvolfirst = [format stringFromNumber:[NSNumber numberWithFloat:vol]];
NSString * printvol = [[NSString alloc] initWithFormat: @"%@M", printvolfirst];
self.Pop.vol.text = printvol;
[printvol release];
//[printvolfirst release];
[format release];
stringFromNumber:
自动删除返回的对象。如果您再次释放它,它将在释放后释放
事实上,您甚至不需要以下代码:
NSString*printvolfirst=[[NSString alloc]init];
您可以在生成设置中打开“运行静态分析器”以获得有关此类事件的警告。stringFromNumber:
自动删除返回的对象。如果您再次释放它,它将在释放后释放
事实上,您甚至不需要以下代码:
NSString*printvolfirst=[[NSString alloc]init];
您可以在生成设置中打开“运行静态分析器”以获得有关此类事件的警告。您正在解除分配自动释放
d字符串。尽管您正在执行NSString*printvolfirst=[[NSString alloc]init]当执行printvolfirst=[format stringFromNumber:[NSNumber numberWithFloat:vol]]时,您将丢失对该对象的引用代码>将自动释放的对象指定给printvolfirst
。在此过程中,您还创建了内存泄漏。您不必释放它。您正在释放一个自动释放d字符串。尽管您正在执行NSString*printvolfirst=[[NSString alloc]init]当执行printvolfirst=[format stringFromNumber:[NSNumber numberWithFloat:vol]]时,您将丢失对该对象的引用代码>将自动释放的对象指定给printvolfirst
。在此过程中,您还创建了内存泄漏。你不必发布它。很有趣。如果我直接使用alloc/init,我认为我“拥有”了这个变量,并且我拥有它直到我释放它。不是吗?如果我想先保留printVol,而不是自动释放它,我该怎么做?您可以通过发送retain
消息来保留它。确实,当您alloc
、retain
或copy
一个对象时,您拥有它。但您所做的是分配一个对象,然后将其设置为一个新对象,这会立即导致内存泄漏。如果启用分析仪,它将准确地告诉您做错了什么。:)@andrewjs:你缺少的关键是你没有拥有变量——你拥有对象。首先为变量分配一个空字符串(您拥有),然后丢弃该字符串并分配stringFromNumber:
(您不拥有)的结果。这是两个不同的对象。将它们存储在同一个变量中不会改变它们的内存管理要求。如果我直接使用alloc/init,我认为我“拥有”了这个变量,并且我拥有它直到我释放它。不是吗?如果我想先保留printVol,而不是自动释放它,我该怎么做?您可以通过发送retain
消息来保留它。确实,当您alloc
、retain
或copy
一个对象时,您拥有它。但您所做的是分配一个对象,然后将其设置为一个新对象,这会立即导致内存泄漏。如果启用分析仪,它将准确地告诉您做错了什么。:)@andrewjs:你缺少的关键是你没有拥有变量——你拥有对象。首先为变量分配一个空字符串(您拥有),然后丢弃该字符串并分配stringFromNumber:
(您不拥有)的结果。这是两个不同的对象。将它们存储在同一个变量中不会改变它们的内存管理要求。