【问题标题】:Can I release multiple objects with one line in Objective-C?我可以在 Objective-C 中用一行释放多个对象吗?
【发布时间】:2011-01-16 18:45:08
【问题描述】:

我创建了一堆对象,现在必须编写多行来释放它们。

[Object1 release];
[Object2 release];
...
[ObjectN release];

如何用一条线全部释放?

【问题讨论】:

  • 把它们放在同一行。

标签: objective-c oop memory-management


【解决方案1】:

可能有一种方法可以使用 1 行释放多个对象,但我不推荐它。有一种安全释放对象的好方法:

#define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }

用法:

RELEASE_SAFELY( myObject );    

【讨论】:

  • 你也可以像这样使用序列运算符:[pointer release], pointer = nil;,这样语句的结果就是nil
  • 我声明的重点是在 dealloc 中使用更少的代码。
  • 为什么不建议一行释放多个对象?
【解决方案2】:
#define foreach(item, array) \     
    for(int keep = 1, \
         i= 0,\
         size = sizeof (array) / sizeof *(array); \
     keep && i != size; \
     keep = !keep, i++) \
   for(item = array + i; keep; keep = !keep) 

#define RELEASE_ALL(OBJS...)    ({id objs[]={OBJS}; \
                          foreach(id* v, objs) { RELEASE_SAFELY(*v); }})

为什么不能两全其美? RELEASE_SAFELY(感谢 WrightsCS)你所有的对象一次:

RELEASE_ALL(Object1, Object2, Object3) // etc

【讨论】:

    【解决方案3】:

    这里有一些直接编码的答案,只是想添加一些其他方法。

    您可以在创建时自动释放对象并将它们添加到数组或其他集合中。数组保留对象,dealloc方法释放数组,数组释放所有对象。类似于自动释放池。

    其次,什么是对象生命周期?如果您有一个创建所有对象的循环,并且一次只需要一个,您可以在循环中创建/使用/dealloc 或重用,例如

    for(...)
    {
        [[object init] alloc];
        [object method];
        [object release];
    }
    

    甚至

    [[object init] alloc];
    for(...)
    {
        [object setProperties];
        [object method];
    }
    [object release];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2010-12-22
      • 2011-02-15
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多