gpt4 book ai didi

ios - 释放什么

转载 作者:行者123 更新时间:2023-11-28 19:23:56 25 4
gpt4 key购买 nike

我在理解内存管理方面确实有问题,尽管我认为我理解了。从 plist 导入数据后,我对引用计数的理解变得一团糟(并花了一整天试图修复它)

我的 plist 的结构基本上就是:

<dict>
<key>Menue1</key>
<array>
<dict>
<key>pic1</key>
<string>a</string>
...and so on...
</dict>
<dict>
<key>pic1</key>
<string>a</string>
...and so on...
</dict>
<dict>
<key>pic1</key>
<string>a</string>
...and so on...
</dict>
</array>
<key>Menue2</key>
<array>
<dict>
<key>pic1</key>
<string>a</string>
...and so on...
</dict>
<dict>
<key>pic</key>
<string></string>
<key>text</key>
<string></string>
</dict>
</array>
</dict>

在代码中,我通过

访问此内容
//to get the path
path = [[NSBundle mainBundle] pathForResource:@"plistsName" ofType:@"plist"];

//to get the root dictionary from path
NSDictionary *tempdict = [[NSDictionary alloc] initWithContentsOfFile:path];
dict = tempdict;
// [tempdict release]; <-- app crashes when I release this

// to get the Array of dicts inside of the dict "Menue1"
exercises = [dict objectForKey:@"Menue1"];

// to get the dictionary containing the detailed informations
exerciseViewContent = [[NSDictionary alloc] initWithDictionary:[exercises objectAtIndex:0]];

我确实理解引用计数的概念(我是这么认为的),但我的基础数学显然不及格。

由于 @interface 我想引用如下:

dict = 1
exercises = 1
exerciseViewContent = 1

viewDidLoad 之后,我假设上面所有这些我假设它像

dict = 1
exercises = 1
exerciseViewContent = 2
tempdict = 1

所以一开始我认为我必须在 viewDidLoad 以及 tempdict 中释放一次 exerciseViewContent,然后释放所有三个( dict, exercise, exerciseViewContent) 在 dealloc 中使它们都等于 0。摆弄了一段时间后,我发现我必须释放 exerciseViewContentdealloc 中,但不是 exercisedict (我确实将它们的属性设置为保留在界面中并合成它们),但是完全不需要释放 tempdict 超出了我的理解,因为我确实使用了 alloc。只需摆弄它现在就可以工作(直到现在)。

所以我想知道:

  • 首先:我的内存管理是否正确?
  • 例如什么时候dict 发布了,因为我从未发布过它(或者我的应用程序崩溃了)?
  • 这是从 plist 访问字典和数组的正确方法吗?
  • 我假设 initWithContentsOfFile 包括自动释放,但我怎么知道呢?是否有包含自动释放的方法列表(或不包含自动释放的列表,哪个更短)?
  • 我想要一个实际可行的经验法则,因为“每个分配或初始化都需要一个释放”显然不适合这里。

另外,我需要释放“路径”吗?

还有:

[timer invalidate];
timer = nil;

与释放相同,因为我显然也不必释放计时器 (NSTimer),尽管我将其属性设置为保留?或者这是因为它是一个不需要释放的 NSTimer,就像 NSInteger 一样?我可以在类引用的哪个位置看到默认情况下哪些类型必须发布,哪些没有?

和:

  • (来自 Xcode 模板:)

    (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    }

如果我将它的属性设置为保留在界面中,我是否仍然需要释放“myOutlet”?

最佳答案

变量 dict 和 tempDict 是指向对象的指针,而不是对象本身。所以当你这样做时:

dict = tempDict;

您实际上只为相同 对象设置了别名。将 release 发送到 tempDict 也是将其发送到 dict。这就是你崩溃的原因。您释放了一个您刚刚分配的对象,因此您不再拥有它。该对象被释放,使 dict 成为悬空指针。

is my memory management correct like this?

没有 [tempDict release],在某种程度上是的。当你用完它们时,你需要释放 dict 和 exerciseViewContent,因为你通过分配获得了它们。

When is e.g. dict released, as I never release it (or my App crashes)?

正如我上面所说,tempDict 指向同一个对象。释放 tempDict 并释放 dict。

Is this the proper way of accessing dicts and arrays from a plist?

没关系,只是我会像这样获取 exerciseViewContent:

exerciseViewContent = [exercises objectAtIndex:0];

那你就不用释放了。

assume initWithContentsOfFile includes autorelease, but how should I know that?

不,它没有。重要的一点是该对象是使用 alloc 获得的,这意味着您拥有它。您应该如何通过了解 C ocoa Memory Management Rules 来了解它.

I'd like to have a rule of thumb that actually works out, because "every alloc or init needs a release" apparently doesn't fit here.

是的,它确实适合。你只是误解了这行的意思:

dict = tempDict;

关于ios - 释放什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6124564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com