Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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/9/ios/121.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 初始、分配和保留以及;初始值永远不会被读取";_Objective C_Ios - Fatal编程技术网

Objective c 初始、分配和保留以及;初始值永远不会被读取";

Objective c 初始、分配和保留以及;初始值永远不会被读取";,objective-c,ios,Objective C,Ios,我已经使用静态分析器查看了我的代码,并得出了以下问题 NSString *string = [[NSString alloc] init]; string = [object name]; 这给了我一个内存错误,表示从未读取初始值。 我将其替换为以下内容 NSString *string = [[object name]retain]; 这种编码是否更好/正确 干杯此代码: 1: NSString *string = [[NSString alloc] init]; 2: string =

我已经使用静态分析器查看了我的代码,并得出了以下问题

NSString *string = [[NSString alloc] init];
string = [object name];
这给了我一个内存错误,表示从未读取初始值。 我将其替换为以下内容

NSString *string = [[object name]retain];
这种编码是否更好/正确

干杯

此代码:

1: NSString *string = [[NSString alloc] init];
2: string = [object name];
不正确,因为在第1:行中分配了新内存,并将对它的引用存储在变量
字符串中。在第2行:您将对另一个内存位置的引用存储在变量
字符串中

结果,您没有读取在1:行分配的内存值,甚至没有
释放它。此外,这里还有内存泄漏


如果要将引用保存到内存中的某个位置,则不需要
alloc+init
。当您想在内存中分配一些空间来写入数据或从中读取数据时,应该使用
alloc+init

我见过其他人做过同样的事情<代码>NSString*string=[[NSString alloc]init]创建新对象并将其指定给字符串<代码>字符串=[对象名称]
对象的名称指定给字符串。这类似于说
inta=0;a=4
0
4
没有影响。代码的问题是
[[NSString alloc]init]
创建了一个保留计数为1的新对象,因为您没有释放它,它会泄漏<代码>[对象名称]
返回自动释放的对象,该对象将在运行循环结束时消失


简而言之,使用
NSString*string=[[objectname]retain]

您的变量
string
实际上是指向
NSString
对象的指针。代码的第一行创建了一个新的空字符串,并将指向它的指针指定给
string
。然后,第二行代码立即用指向完全不同字符串的指针覆盖该指针。您从未读取原始值,并且无法访问分配的
NSString
,因此它已泄漏

第二个选项是正确的,前提是您稍后在某处释放/自动释放它