0
@implementation GroupedInexedViewController
{
    NSDictionary *names;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                 ofType:@"plist"];
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
    names = dict;
    [dict release];
}

解除分配'dict'会影响'names'吗?我的意思是它是否也取消分配“名称”?我在另一篇文章中看到这是一种不好的做法?但为什么?

编辑:ARC被禁用。

4

5 回答 5

1

由于您手动调用发布,我将假设您没有使用自动引用计数 (ARC)。

这里有一些术语混淆。

它不会解除分配names。您正在减少dict调用 release 时的引用计数。一旦该引用计数达到 0,内存将被释放。

问题是您没有dictnames调用retain.dict

保留一个对象会增加它的引用计数。

您可以选择创建*names一个属性,它将为您处理内存管理,或者您可以通过调用 retain 手动增加引用计数:names = [dict retain];

如果这样做,还必须在 dealloc 方法内部实现一个方法deallocrelease names

于 2012-11-15T06:49:01.073 回答
1

您的代码分配names. 是指向对象的指针,因此当您将其值分配给另一个指针 ( ) 时,两个指针都引用同一个对象,可以认为是相同的。dictdictnames

所以是的,当你释放时dict,你也在释放names

顺便说一句,您可以names直接分配给,而无需通过dict

names = [[NSDictionary alloc] initWithContentsOfFile:path];

而且,如果您可以启用 ARC,则无需担心释放对象。

于 2012-11-15T06:49:22.803 回答
1

简而言之,如果您不使用 ARC,是的:取消分配dict会影响names. 这是因为您将names指针分配给NSDictionary已分配的单曲。

如果您想在 dealloc 时names保留,则需要发送一条消息:NSDictionarydictdictretain

names = [dict retain];
于 2012-11-15T06:52:42.887 回答
1

到目前为止,似乎没有任何答案提到 ARC 和非 ARC (MRC) 用法之间的区别以及属性和实例变量之间的区别。

首先,属性实际上只是由实例变量支持的 setter 和 getter 方法。当您设置属性 likeself.dict = someObject;并且该属性被声明为strongorretain时,则someObject保留。

但是,如果您只有一个实例变量(不是属性)并且您正在使用 MRC,那么仅写入dict = someObject;重复指针但不会增加引用计数 - 如果您[someObject release]在此之后写入,您应该假设它dict也无效(即使这两个指针指向的对象实际上并没有被释放——这是引用计数的规则)。

如果您使用 ARC,则分配给变量也会将引用计数增加一 - 因此,如果someObject引用计数为 1,则写入dict = someObject;会将对象的引用计数(现在由 和指向增加到 2。dictsomeObject

于 2012-11-15T07:05:32.923 回答
0

dict 和 names 是两个不同的变量,不要混用!!!

仅当您分配、复制、可变复制、保留时才“释放”。否则,如果在自动释放模式下创建。

如果您使用的是 ARC,则不需要“发布”编译器来处理所有这些新分配的空间。

于 2012-11-15T06:48:42.397 回答