目标C:发布对象基本问题(非ARC)

时间:2012-12-10 00:10:37

标签: ios autorelease objective-c-2.0

在没有GC的非ARC项目中,我有两个关于内存管理的新手问题: 在Objective C中,当我'自动释放'对象并从方法返回它时,我应该在“父方法”中“释放”它,调用方法重新调整对象吗?

第二个问题是,我从方法返回对象(fe user )(另一个对象的实例方法,fe userService )并将其保存到属性( self.userProp self 实例化对象 userService 并调用他的方法)。当我发布对象 userService (其方法返回对象 user ,存储在属性 self.userProp 中)时,它还释放了存储在其中的对象存储在属性 self.userProp 中的property(object user )。为什么?谁是物业中物体的拥有者?

谢谢

1 个答案:

答案 0 :(得分:2)

  

当我'自动释放'对象并从方法返回它时,我应该   '释放'它在“父方法”中调用方法重新调整   对象

没有。这就是原因。让我们按照你所说的那样布置一个例子:

-(NSObject*)someMethodThatReturnsAnAutoreleasedObject {
    return [[[NSObject alloc]init]autorelease];
}

-(void)myMethod {
    NSObject *obj = [self someMethodThatReturnsAnAutoreleasedObject];
    [obj doSomething];
    [obj release] //PROBLEM!
}

逐步查看对象的保留计数,您会看到虽然-autorelease可能不会立即导致问题,但它会在稍后的某个时间(因为-autorelease 'd对象不是“自动释放”,而是当它们的拥有池被耗尽或解除分配时它们被大量释放)。返回自动释放对象的方法返回它,最终保留计数为0(0(开始)+ 1(alloc) - 1(自动释放)),因此释放它不仅不必要,而且会导致崩溃。

  

第二个问题是,我从方法返回了对象(f.e.user)   (另一个对象的实例方法,例如userService)并将其保存到   property(self.userProp,self实例化对象userService和   叫他的方法)。当我发布对象userService(其中   方法返回对象用户,存储在属性self.userProp中,它   还发布了存储在属性中的对象(存储在对象中的对象)   property self.userProp)。为什么?谁是该对象的所有者   属性?

同样,首先进行一些设置(这首先是相当复杂的,但是在看到你正在做的事情之后完全有意义。)

-(NSUserService*)someMethodThatReturnsAnAutoreleasedObject {
    return [[[NSUserService alloc]init]autorelease];
}

-(void)myMethod {
    self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];
    [obj doSomething];
    [obj release] //No problem, assuming userService is declared retain or strong.
}

那么,为什么会有所不同?记忆限定符,这就是原因!声明属性时,声明一组内存限定符以告诉编译器要将哪种修饰符附加到赋值符号。大多数属性都声明为retain或强((在ARC下),如果它们是对象类型,希望你的userService也被声明为这样,这会使编译器解释

self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];

作为

self.userservice = [[self someMethodThatReturnsAnAutoreleasedObject]retain];

因此,您必须释放它,否则您的手上有泄漏(0(开始)+ 1(分配) - 1(自动释放)+ 1(保留)= +1)。