学习Obj-C内存管理

时间:2008-12-16 04:02:10

标签: iphone objective-c cocoa macos memory-management

  

可能重复:
  Where are the best explanations of memory management for iPhone?

我来自网络开发背景。我擅长XHTML,CSS,JavaScript,PHP和MySQL,因为我在日常工作中使用了所有这些技术。

最近我在晚上和周末一直在修补Xcode中的Obj-C。我已经为iPhone和Mac OS X编写了代码,但我无法理解内存管理的实用性。我理解高级概念,但不清楚这在实现中是如何发挥作用的。 Web开发人员通常不必担心这些事情,所以对我来说这是一个新手。

我已经尝试过为我的项目添加内存管理,但事情通常会崩溃。有关如何学习的任何建议?任何建议都表示赞赏。

6 个答案:

答案 0 :(得分:3)

除了链接的帖子中列出的官方Apple资源之外,以下是关于该主题的其他一些好的读物:

Hold me, use me, free me
CocoaDev.com 's Memory Management Section

并帮助调试内存管理问题:
NSZombieEnabled

答案 1 :(得分:2)

经验法则

自动释放

每次有[[NSObject alloc] init]时,请将其换成autorelease

// make sure it gets properly released
// autorelease releases the object at a later time.
NSObject *instance = [[[NSObject alloc] init] autorelease];

这样的事情(不记得这个术语)总是自动释放,你应该创建你的类来对应这个规则:

NSString *test = [NSString stringWithFormat:@"%i", 4];

保留/释放

如果您需要将对象存储的时间超过当前方法,请保留它:

[instance retain];

如果您不再需要它或与另一个物体交换它:

[instance release];

您的代码中应始终与retains具有相同数量的releases

访问者

Objective-C 2.0让你声明属性并为你编写访问器。例如@property(retain, readwrite) NSString *text;看起来像这样:

- (NSString *)text {
    return text; // I don't like calling variables _test
}

- (void)setText:(NSString *)newText {
    [newText retain];
    [text release];
    text = newText;
}

init / dealloc

在这些方法中,您应始终使用[self setVariable:…],如下所示:

- (id)init {
    if (self = [super init]) {
        [self setText:@"Lorem ipsum dolor sit amet."];
        // …
    }
    return self;
}

- (void)dealloc {
    // make sure text is set to nil and the old value gets released.
    [self setText:nil];
}

垃圾收集器

使用Garbage Collector built into Objective-C 2.0,如果可以的话,不使用它几乎没有收获。

如何保留/释放工作?

每次分配对象 1 [NSObject alloc]时,保留计数设置为1.如果此计数达到0,则删除对象。 [instance retain]将计数增加1,[instance release]将计数减少1。

1 [instance copy]确实也分配了一个新实例,因此保留计数也为1。

答案 2 :(得分:1)

由于保留/发布范式,Cocoa中的内存管理实际上非常简单。首先学习指针的概念 - 虽然你不需要成为C的专家来学习目标-c,理解指针是必不可少的。然后阅读this(或其他)指南。如果你需要的时候记下规则,你应该和不应该保留一个对象,并且通过一些练习,你应该立刻“得到它”。

请记住,你可以打开垃圾收集而不用担心内存管理,但我不建议这样做;即使启用GC,仍有时候你必须了解幕后发生的事情。

答案 3 :(得分:1)

阅读arul提供的链接。既然您正在使用没有垃圾收集的语言(如果您正在为iPhone开发),那么就该开始考虑对象的生命周期了。您实例化的每个对象现在都必须由某人(可能是您)解除分配。内存管理不是一个容易的主题,唯一的方法就是练习。玩弄分配对象并解除分配。在将对象添加到集合时,请观察保留计数增长。查看Autorelease池。基本上,您应该知道对象分配和取消分配的位置和时间。在内存有限的系统(如iphone)上,您希望对象尽快消失。

我建议您在开始处理大部分应用程序之前花几天时间来处理内存管理。调试内存问题和应用程序逻辑的困难是一件麻烦事。

答案 4 :(得分:0)

我使用了Mac Developer Network中的内存管理视频培训课程。当我开始时,准确地给了我所需要的东西。当我开始遇到自己的内存管理问题时,它立即付出了实惠。

答案 5 :(得分:0)

我经常看到的一个错误是在常规版本发布时会使用自动释放便捷性调用。这只会让您的生活变得困难,因为这会从调用站点中消除问题,同时使得很难在大型代码库中隔离问题。

这也迫使你从一开始就学习内存管理,这不好玩,但是值得,因为你通常可以挽救你写的更多代码。