2

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

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

    obj_number = [[NSNumber alloc] init];

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

    obj_number = [dataset objectAtIndex:0];

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

我看看一个对象是否只是在一个所有权之下,所以如果父级解除分配它也被解除分配,但在我的情况下,我认为 obj_number 在 2 个所有权下(保留计数可能等于 2),那么为什么用完方法 A 它被释放?

4

3 回答 3

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。

于 2012-12-07T11:09:58.527 回答
0

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

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

我的班级.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];
}
于 2012-12-07T11:16:07.123 回答
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 所说,在大多数情况下,最好使用属性,因为它们为您进行内存管理。

于 2012-12-07T11:20:33.190 回答