Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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_Memory Management_Memory Leaks - Fatal编程技术网

这是在Objective-C中调用对象释放的正确情况吗?

这是在Objective-C中调用对象释放的正确情况吗?,objective-c,memory-management,memory-leaks,Objective C,Memory Management,Memory Leaks,我是Objective-C的新手,在理解内存管理方面遇到了一些困难 假设我有一个NSString*类型的类和实例变量,它没有绑定到属性。这种情况会泄漏内存吗 myString = [[NSString alloc] init]; //more program stuff myString = [[NSString alloc] init]; 在将myString设置为新对象之前,是否应该调用[myString release]?这种代码会泄漏内存吗?每次指针指向不同的对象时,是否必须释放这样

我是Objective-C的新手,在理解内存管理方面遇到了一些困难

假设我有一个NSString*类型的类和实例变量,它没有绑定到属性。这种情况会泄漏内存吗

myString = [[NSString alloc] init]; 
//more program stuff
myString = [[NSString alloc] init];
在将myString设置为新对象之前,是否应该调用
[myString release]
?这种代码会泄漏内存吗?每次指针指向不同的对象时,是否必须释放这样的对象?

是,这会泄漏

通过将另一个
NSString
实例分配给同一变量
myString
,您将失去对
myString
原始内容的引用,因此无法向其发送发布消息。
叮当声静态分析仪和泄漏仪器都应发现该泄漏。

是,这将泄漏

通过将另一个
NSString
实例分配给同一变量
myString
,您将失去对
myString
原始内容的引用,因此无法向其发送发布消息。

Clang static analyzer和Leaks instrument都应该发现此泄漏。

是的,在重新分配变量以指向第二个对象之前,需要释放第一个对象。否则,您将无法跟踪第一个对象,并且由于无法释放它而将其泄漏。您负责释放对象,因为您创建了它(通过
alloc
),如中所述


另外,请记住,
[[NSString alloc]init]
正在创建一个空且不可变的字符串(
NSString
s是不可变的,这意味着它们在创建后不能更改)。这样做没有什么意义。

是的,在重新分配变量指向第二个对象之前,需要释放第一个对象。否则,您将无法跟踪第一个对象,并且由于无法释放它而将其泄漏。您负责释放对象,因为您创建了它(通过
alloc
),如中所述

另外,请记住,
[[NSString alloc]init]
正在创建一个空且不可变的字符串(
NSString
s是不可变的,这意味着它们在创建后不能更改)。这样做没有什么意义。

首先,苹果是一个寻找内存管理示例和说明的好地方

现在谈谈你的问题。当您调用
myString=[[NSString alloc]init]时
您正在重新分配指针
myString
,因此无法访问原始的
NSString
,从而造成内存泄漏

这里的一般经验法则是,对于每个
alloc
,您都应该有一个
版本
,并且这些版本必须适当地交替。如果你这样做

myString = [[NSString alloc] init]; 
// ...
myString = [[NSString alloc] init];
// ...
[myString release];
[myString release];
您将两次释放同一实例,这将导致过度释放和错误访问。正确的做法是

myString = [[NSString alloc] init]; 
// ...
[myString release];
myString = [[NSString alloc] init];
// ...
[myString release];
以便正确释放每个实例

首先,苹果是寻找内存管理示例和说明的好地方

现在谈谈你的问题。当您调用
myString=[[NSString alloc]init]时
您正在重新分配指针
myString
,因此无法访问原始的
NSString
,从而造成内存泄漏

这里的一般经验法则是,对于每个
alloc
,您都应该有一个
版本
,并且这些版本必须适当地交替。如果你这样做

myString = [[NSString alloc] init]; 
// ...
myString = [[NSString alloc] init];
// ...
[myString release];
[myString release];
您将两次释放同一实例,这将导致过度释放和错误访问。正确的做法是

myString = [[NSString alloc] init]; 
// ...
[myString release];
myString = [[NSString alloc] init];
// ...
[myString release];

以便正确释放每个实例

对于未来,坚持一条简单的规则,即对于每个
alloc
/
副本
/
保留
您应该将其与
发行版
配对,对于未来,坚持一条简单的规则,即对于每个
alloc
/
副本
/
保留
您应该将其与
发行版
配对,坚持一条简单的规则,即对于每一个新的/alloc/retain/copy(NARC),您都应该将其与发布或自动释放配对。对于未来,坚持一条简单的规则,即对于每一个新的/alloc/retain/copy(NARC)您应该将它与释放或自动备份配对。请考虑使用XARC 4.2中可用的ARC*自动引用计数,并且可以使用IOS 4.3.3和以上。然后不保留/释放/自动写入。考虑使用XARC 4.2中可用的ARC*自动引用计数,并且可以使用IOS 4.3.3和以上。然后就没有保留/释放/自动释放来写了。