object c - 从2个其他对象释放一个对象,该对象是所有者

时间:2012-12-07 10:57:23

标签: objective-c

从研究目标C的内存管理,我有一个关于引用计数的问题:

我有一个对象名obj_number。我已经分配了它

    obj_number = [[NSNumber alloc] init];

然后在这个类的另一个方法(名为A)中,我设置了

    obj_number = [dataset objectAtIndex:0];

出去这个方法数据集将自动释放。出门后我检查了这个方法obj_number也无法访问,也许它也是deallocate。

我看到一个对象是否属于一个所有权,所以如果父取消分配它也是解除分配,但在我的情况下,我认为obj_number低于2所有权(保留计数可能等于2),所以为什么要运行方法A呢被释放?

3 个答案:

答案 0 :(得分:1)

编辑:您使用的是非ARC吗?

在方法中,您可能会喜欢这样:

-(void)A{
    ....
    obj_number = [dataset objectAtIndex:0];
    [dataset autorelease];
}

在上面你要改变obj_number的指针指向[dataset objectAtIndex:0]

根据您的under 2 ownership (retain count may equals to 2)

我希望你的意图是copyretain这个价值,对吧?

然后你可以使用obj_number = [[dataset objectAtIndex:0] copy];//or retain,然后它的保留计数将增加到2。

答案 1 :(得分:0)

您需要为obj_number提供一个setter方法,您可以通过在@property文件中提供.h并在@sythesize中提供.m来实现这一方法。文件。 setter方法将确保释放旧值并保留新值。

MyClass.h:

@interface MyClass : NSObject
{
    NSNumber *_obj_number;    // Use a different name for the ivar and property!
    ...
}

@property (retain, nonatomic, readwrite) NSNumber *obj_number;

...

@end

MyClass.m:

@implementation MyObject
@synthesize obj_number = _obj_number;

...

- (void)dealloc
{
    self.obj_number = nil;
    ...
    [super dealloc];
}

分配到obj_number时,您必须放弃所有权:

- (void)someMethod
{
    // We own myNumber, so release
    NSNumber *myNumber = [[NSNumber alloc] initWithUnsigned:12];
    self.obj_number = myNumber;
    [myNumber release];

    // However this is easier:
    self.obj_number = [NSNumber numberWithUnsigned:12];
}

- (void)someOtherMethod
{
    // We don't own [dataset objectAtIndex:0] so no need to release
    self.obj_number = [dataset objectAtIndex:0];
}

答案 2 :(得分:0)

你不应该考虑保留计数。重要的是所有权。

obj_number = [[NSNumber alloc] init];

创建您拥有的新NSNumber实例。这意味着您必须在不再需要时释放它。

obj_number = [dataset objectAtIndex:0];

这会为您提供一个您不拥有的对象。你不必释放它。如果您想要所有权,则必须向其发送保留消息,并且必须在以后发布。

您的代码的另一点。如果你写了类似的东西你有内存泄漏(如果你不使用ARC):

//obj_number = [[NSNumber alloc] init]; // returns nil, so no leak
obj_number = [[NSNumber alloc] initWithInt:1];
some code // No [obj_number release] or [obj_number autorelease] here
obj_number = [dataset objectAtIndex:0];

最后一行导致泄漏。在该行之后,obj_number指向索引0处的数据集中的对象,而不再指向您在开头分配的NSNumber。

编辑: 就像trojanfoe所说,在大多数情况下,最好使用属性,因为它们会为你进行内存管理。