【发布时间】:2011-01-16 18:45:08
【问题描述】:
我创建了一堆对象,现在必须编写多行来释放它们。
[Object1 release];
[Object2 release];
...
[ObjectN release];
如何用一条线全部释放?
【问题讨论】:
-
把它们放在同一行。
标签: objective-c oop memory-management
我创建了一堆对象,现在必须编写多行来释放它们。
[Object1 release];
[Object2 release];
...
[ObjectN release];
如何用一条线全部释放?
【问题讨论】:
标签: objective-c oop memory-management
可能有一种方法可以使用 1 行释放多个对象,但我不推荐它。有一种安全释放对象的好方法:
#define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
用法:
RELEASE_SAFELY( myObject );
【讨论】:
[pointer release], pointer = nil;,这样语句的结果就是nil。
#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
【讨论】:
这里有一些直接编码的答案,只是想添加一些其他方法。
您可以在创建时自动释放对象并将它们添加到数组或其他集合中。数组保留对象,dealloc方法释放数组,数组释放所有对象。类似于自动释放池。
其次,什么是对象生命周期?如果您有一个创建所有对象的循环,并且一次只需要一个,您可以在循环中创建/使用/dealloc 或重用,例如
for(...)
{
[[object init] alloc];
[object method];
[object release];
}
甚至
[[object init] alloc];
for(...)
{
[object setProperties];
[object method];
}
[object release];
【讨论】: