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,而是内存单元