从研究目标C的内存管理,我有一个关于引用计数的问题:
我有一个对象名obj_number。我已经分配了它
obj_number = [[NSNumber alloc] init];
然后在这个类的另一个方法(名为A)中,我设置了
obj_number = [dataset objectAtIndex:0];
出去这个方法数据集将自动释放。出门后我检查了这个方法obj_number也无法访问,也许它也是deallocate。
我看到一个对象是否属于一个所有权,所以如果父取消分配它也是解除分配,但在我的情况下,我认为obj_number低于2所有权(保留计数可能等于2),所以为什么要运行方法A呢被释放?
答案 0 :(得分:1)
在方法中,您可能会喜欢这样:
-(void)A{
....
obj_number = [dataset objectAtIndex:0];
[dataset autorelease];
}
在上面你要改变obj_number的指针指向[dataset objectAtIndex:0]
。
根据您的under 2 ownership (retain count may equals to 2)
我希望你的意图是copy
或retain
这个价值,对吧?
然后你可以使用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所说,在大多数情况下,最好使用属性,因为它们会为你进行内存管理。