代码之家  ›  专栏  ›  技术社区  ›  Tim Reddy

NSMT射线阵列容量与容量

  •  6
  • Tim Reddy  · 技术社区  · 14 年前

    我是一个具有广泛Java背景的iPhone / Objtovi-C新手。

    我正在学习更多关于Objective-C内存管理的知识,我正在阅读苹果公司关于内存管理的文档: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    在对象所有权策略部分中,它表示您拥有通过以alloc、new或contains copy开头的方法创建的任何对象。所有权意味着你需要明确 release 当你完成它的时候。

    所以我正在看NSMutabLayReX文档: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

    有两种方法可以做同样的事情……它们都创建了一个具有一些初始容量的数组。一个是类方法,另一个是实例方法。

    + (id)arrayWithCapacity:(NSUInteger)numItems;
    - (id)initWithCapacity:(NSUInteger)numItems;
    

    既然我是一个懒惰的Java开发者,为什么我会选择在类方法中选择实例方法,知道在某个时候我必须自己清理?

    我想我可能缺少一个基本点……这仅仅是一个决定的问题。 什么时候 对象发布了吗? autorelease 在类方法与 释放 在实例方法中?我想,在一个资源非常有限的平台上(iPhone),我应该避免使用class方法,并在完成后立即释放对象?

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  9
  •   Jason Coco superfell    14 年前

    您通常会根据是否要拥有对象超过当前方法的生命周期来选择(例如,将其分配给某个静态的或直接分配给一个IVAR)。在这种情况下,您可以使用alloc/in it方法,因为您知道您想拥有它。如果您计划只在当前方法的范围内使用它,或者打算将它分配给像属性这样的托管对象,那么您可能会使用方便方法。

    当你知道你要拥有一个你正在创建的对象时,alloc/init调用总是比方便/保留方式更有效,因为后者基本上需要alloc/init/autorelease对象,然后在返回时保留它。

    当您在循环中分配并且不需要/不想处理自动释放池时,也可以使用直接alloc/init方法。

        2
  •  6
  •   Jaanus    14 年前

    数组容量:已经有自动回复了。

    initWithCapacity:明确保留,您需要自己释放它。由于您通常称它为[[a alloc]in it…],这将触发一个灯泡“我需要为此管理内存”,除“alloc”之外的其他类似的魔法词是“新的”和“复制”,如您在内存管理指南中所读。但从你的问题来看,你似乎很了解它的原理。

    您是正确的,应该保持内存占用的管理和低,但这并不意味着您需要始终执行显式初始化/发布。正如尼克所说,使用autorelease-factory方法的一个用例是将它们作为参数传递。

    另一个例子是,当您向集合(如nsdictionary或nsarray)添加某些内容时,可以使用autorelease factory方法创建“something”,因为集合“接管”了它。(添加到集合时保留内容,删除时释放。)

    你可以争辩说

    Blah *blah = [Blah blahWithSomething];
    [myMutableArray addObject:blah];
    

    只是比类型更干净

    Blah *blah = [[Blah alloc] initWithSomething];
    [myMutableArray addObject:blah];
    [blah release];
    

    在第一种情况下,您根本不需要担心发布调用。缺点是,在同一个runloop中多次执行此操作时,如果第一个case是在runloop末尾消失的临时/一次性数组对象,则它的内存占用会更大。但是,如果它是一个小对象,而不是在一个循环中完成,并且像通常情况那样保留更长的时间,那么它们的足迹是相同的。

        3
  •  0
  •   Nick    14 年前

    在这种情况下,我尝试遵循以下规则来避免内存相关(= =“非常讨厌”)错误:

    • 如果要将该数组作为参数传递,那么可以使用factory方法,这没问题,因为接受函数负责保留/释放它。
    • 如果要继续使用该对象,请使用初始化方法并在结束时释放该对象。