Ios iPhone内存管理需要澄清吗
我需要一些关于iPhone内存管理的说明 这是一个二传手的例子Ios iPhone内存管理需要澄清吗,ios,memory-management,autorelease,Ios,Memory Management,Autorelease,我需要一些关于iPhone内存管理的说明 这是一个二传手的例子 1) 在这个例子中,为什么我们必须使用自动释放? 我们可以用下面的方法吗 if(value) [value release]; value = [input retain]; 在第一个示例中,为什么不应释放输入的内存 2). 如果我使用以下语句;值的保留计数是多少 NSString *value; value = @"welcome"; 在上面的语句之后,我只想再设置一个值。那么会发生什么 eg: value = @"For t
1) 在这个例子中,为什么我们必须使用自动释放? 我们可以用下面的方法吗
if(value)
[value release];
value = [input retain];
在第一个示例中,为什么不应释放输入的内存
2).
如果我使用以下语句;值的保留计数是多少
NSString *value;
value = @"welcome";
在上面的语句之后,我只想再设置一个值。那么会发生什么
eg:
value = @"For testing";
3) 。
2)和3)之间有什么不同
提前感谢。如果“输入”与“值”是完全相同的对象,则调用[value release]可以解除锁定该对象。因此,必须保留新输入值,释放旧值,然后将新值分配给ivar:
[input retain];
[value release];
value = input;
在2)和3)中的每一个之后,NSString*值都指向一个文本NSString对象,在每种情况下,retain计数都是1,释放它可能不是一个好主意
在此代码之后:
value = [input2 retain];
值是input2对象的别名。要认识到的是,对象有保留计数,变量没有
至于你的最后一个案子
NSString *value = [[[NSString alloc] init] autorelease];
它创建一个自动释放的空字符串。如果在自动释放实际发生后再次引用该对象,则可能会发生崩溃,因为您将引用一个不再存在的对象。如果在保留新值之前释放一个值,则如果两次设置相同的值,则可能会出现问题。如果调用方没有保留自己的副本,则会发生这种情况,例如,当调用方从试图设置它的同一对象获取值时,如下所示:
object.value = object.value;
该语句将导致对象在再次保留之前被释放,这可能导致内存被释放,并导致悬空指针被保留。通过执行自动释放,它可以确保将同一指针复制到自身上可以正常工作。1)
由于以下原因,您必须执行自动释放:
当输入和值是同一个对象,并且您将释放值时,它的保留计数将达到零,并在您可以通过输入再次保留它之前被释放。
您可以使用retain执行此操作,但必须更改代码:
-(void)setValue:(NSString*)input{
if (value != input) {
[value autorelease];
value = [input retain];
}
}
(二)
我相信,"文本"将被视为一个常量。当您想要一个不需要任何内存管理的对象时:
NSString *value = [NSString stringWithString:@"Text"];
这将返回一个自动释放的对象
3) 在本例中,它不是关于值的保留计数,而是关于引用值一的两个对象的保留计数。
如果在离开该方法之前不释放input1,则会出现内存管理问题
4) 这句话应该行得通。没有理由争辩。您宁愿使用[NSString]
注:
对于内存管理:当您使用alloc new或copy时,您还必须在同一范围内的同一对象上使用release或autorelease。我通常按照
- (void)setValue:(NString *)input {
if (value != input) {
[value release];
value = [input retain];
}
}
这避免了输入和值都是同一对象的问题。如果您只是在不检查的情况下释放它,那么您可能会完全释放它,下一行将尝试保留一个不再存在的对象
但是,复制字符串而不是保留字符串是最佳做法:)(假设您在非gc环境中工作)
1) 您可以创建一个临时变量,并在保留/分配后释放临时变量。否则,您需要比较指针。延迟释放还可以屏蔽线程错误(无论您认为是好还是坏……)< /P>
2) 从技术上讲,NSString文本在程序的整个生命周期内都是有效的。那就是:while(1)[@“为什么我不会死?”发布]代码>生成一个无限循环
3) 使用显式保留、alloc+init、new和copy,必须使用release或autorelease平衡保留计数。由于您没有发布value1,静态分析可能(正确地)将其视为泄漏。因为字符串常量永远不会消失,所以这两个常量在这方面是不可比较的
4) 那根柱子没问题。问题出在程序的其他地方。要么将其分配给ivar而不保留,要么稍后将其释放
尝试经常使用静态分析,并尝试减少使用autorelease的次数(您无法完全避免)
所有这些都不是魔术,但您至少可以通过不到处使用自动释放功能,将许多问题的位置减少到调用站点(或非常接近)。只要在可能的情况下使用手动保留/释放即可
最后,检查是否存在泄漏,并在启用NSZombies的情况下运行
-(void)setValue:(NSString*)input{
if (value != input) {
[value autorelease];
value = [input retain];
}
}
NSString *value = [NSString stringWithString:@"Text"];
- (void)setValue:(NString *)input {
if (value != input) {
[value release];
value = [input retain];
}
}