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

Objective c 设定器中不必要的释放

Objective c 设定器中不必要的释放,objective-c,memory-management,accessor,Objective C,Memory Management,Accessor,有很多关于我们应该如何做的例子,例如: - (void)setFoo:(NSString *)newFoo { if (foo != newFoo) { [foo release];//?? foo = [newFoo retain]; } } 我理解我们需要释放prev值,然后用retain分配新值,这是文档要求我们做的,但我不理解如果分配foo=[newFoo retain],我们应该发布什么;使用newFoo的当前retain计数器

有很多关于我们应该如何做的例子,例如:

- (void)setFoo:(NSString *)newFoo
{
    if (foo != newFoo)
    {
        [foo release];//??
        foo = [newFoo retain];
    }
}
我理解我们需要释放prev值,然后用retain分配新值,这是文档要求我们做的,但我不理解如果分配foo=[newFoo retain],我们应该发布什么;使用newFoo的当前retain计数器将foo变成一个新值,如果之前foo的retain计数器是5,它将变成newFoo的+1,或者我遗漏了一些不正确的内容。为什么我们不能这样做:

- (void)setFoo:(NSString *)newFoo
{
     if (foo != newFoo)
     {
         foo = [newFoo retain];
     }
}

Objective-C使用指针(一切都是指针)

当您执行
retain
release
时,您不是在引用/指针(变量名称)上执行此操作,而是在实际对象本身上执行此操作

这就是为什么我们需要释放旧对象(因为我们已经完成了它),并将变量指向新对象(然后增加它的
retain
count,这样它就不会被其他对象删除)

希望有意义

foo是指向存储在内存中的NSString对象的指针(内存地址)。当这个setter函数启动时,内存中有两个NSString对象:一个被foo指向并保留,另一个作为参数传入。每个对象都有自己的保留计数

foo==newFoo告诉指针停止指向旧的NSString,并开始指向新的NSString


如果在更改指针之前没有释放第一个对象,则会导致内存泄漏。旧对象不会有任何指向它的东西(因此,据您的程序所知,它并不存在),但它的保留计数永远不会达到0并被释放,因为它仍然被保留。

oh 10x,我理解。事实上,我们需要释放的不是var,而是内存单元