Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.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
Ios iPhone内存管理需要澄清吗_Ios_Memory Management_Autorelease - Fatal编程技术网

Ios 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

我需要一些关于iPhone内存管理的说明

这是一个二传手的例子
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 newcopy时,您还必须在同一范围内的同一对象上使用releaseautorelease

我通常按照

- (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];
    }
}