这是在Objective-C中调用对象释放的正确情况吗?
我是Objective-C的新手,在理解内存管理方面遇到了一些困难 假设我有一个NSString*类型的类和实例变量,它没有绑定到属性。这种情况会泄漏内存吗这是在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]?这种代码会泄漏内存吗?每次指针指向不同的对象时,是否必须释放这样
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和以上。然后就没有保留/释放/自动释放来写了。