Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 释放已处理的NSString会导致崩溃_Objective C_Cocoa_Memory Management_Nsstring - Fatal编程技术网

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:
(您不拥有)的结果。这是两个不同的对象。将它们存储在同一个变量中不会改变它们的内存管理要求。