【问题标题】:What happens if i call nsobject init more than once? Does it increase retain count?如果我多次调用 nsobject init 会发生什么?它会增加保留计数吗?
【发布时间】:2011-11-07 12:32:56
【问题描述】:

我是 Objective-C 的新手,我在内存管理方面遇到了很多麻烦,但我仍然了解一点。如果我有一个对象,例如 NSArray * myArray,我会这样做

myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil];

然后我正在做某事,我希望 myArray 包含新对象,然后我再次初始化它

[myArray initWithObjects:obj4,obj5,obj6, nil];

似乎它可以满足我的需求,但从内存管理的角度来看,它是否正确?它会增加保留计数吗?那我应该释放它两次吗?

【问题讨论】:

    标签: objective-c memory init nsobject


    【解决方案1】:

    不要那样做!

    一般来说,如果你想重置已经存在的 Objective C 对象中的对象或事物,创建并使用某种 Setter 方法。

    对于您的阵列,再次不要这样做!您引用的“initWithObjects”方法可以方便地使用数组将在其整个生命周期内填充的项目来初始化不可变(不可更改)数组。

    对于您想要做的事情,只需使用 NSMutableArray。下面列出了它的文档:

    http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

    【讨论】:

      【解决方案2】:

      它不会增加保留计数。初始 alloc 将保留计数设置为 1。

      也就是说,您永远不应该对一个对象多次调用 init 方法。虽然您的示例可能有效,但充其量它可能会泄漏其内部存储并且不会释放您的obj1obj2obj3。在最坏的情况下,它可能具有不一致的内部状态并可能导致崩溃。

      如果你只是这样做几次,你不妨创建一个新数组:

      NSArray* myArray = [NSArray arrayWithObjects:obj1, obj2, obj3, nil];
      // Do some stuff...
      myArray = [NSArray arrayWithObjects:obj4, obj5, obj6, nil];
      // Do more stuff
      

      如果你经常这样做,例如,在一个循环中,你可能应该使用 NSMutableArray:

      NSMutableArray* myArray = [NSMutableArray array];
      for (...) {
        [myArray removeAllObjects];
        [myArray addObject:obj4];
        [myArray addObject:obj5];
        [myArray addObject:obj6];
        // Do stuff
      }
      

      【讨论】:

      • 非常感谢您的回复,伙计。你能解释一下我为什么要使用[[myArray alloc] init](这个问题不仅涉及数组,而且涉及所有类型的对象)如果我可以按照你说的那样做 - myArray = [NSArray arrayWithPbjects];?如果它仍然可以在没有分配的情况下使用,为什么人们使用alloc????
      • [NSArray arrayWithObjects:] 只是 [[[NSArray alloc] initWithObjects:] autorelease] 的快捷方式。
      【解决方案3】:

      这是个老问题。但是我通过这个链接找到了类似的答案:

      http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init

      链接中的小引用:

      程序导致两次或多次调用 同一个对象上的 init 方法,除了每个 init 方法 调用最多可以执行一个委托初始化调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 2021-07-13
        • 2011-04-02
        • 1970-01-01
        相关资源
        最近更新 更多