【发布时间】:2019-06-22 21:32:55
【问题描述】:
我正在学习如何在 Objective-C 中进行内存管理。据我所知,标记为autorelease 的对象将被添加到封闭的NSAutoreleasePool 中,并在池被释放/耗尽时被释放。
为了尝试我的新知识,我创建了一些测试;创建 100 万个对象使用 ~17mb,创建相同的对象但立即释放它们使用 ~1mb。但是,我无法让NSAutoreleasePool 工作,使用下面的代码仍然使用 ~17mb,我不明白为什么。
#include <objc/objc-runtime.h>
#include <stdio.h>
int main(void) {
Class NSAutoreleasePool = objc_getClass("NSAutoreleasePool");
Class Object = objc_getClass("NSObject");
SEL new = sel_registerName("new");
SEL drain = sel_registerName("drain");
SEL autorelease = sel_registerName("autorelease");
id pool = objc_msgSend(NSAutoreleasePool, new);
for (int i = 0; i < 1e6; i++) {
id obj = objc_msgSend(Object, new);
objc_msgSend(obj, autorelease);
}
objc_msgSend(pool, drain);
printf("OK\n");
getchar();
return 0;
}
【问题讨论】:
-
你没有为此使用任何 Objective-C 语法有什么原因吗?你真的想要纯C代码吗?如果是这样,请参阅stackoverflow.com/questions/10289890/… 了解相关信息。
-
@rmaddy 不是。我可以让这个例子在简单的objective-c中工作,但我很好奇为什么它在只使用运行时并从常规C编译时不起作用。我做错了什么还是这种行为是预期的?您链接的问题也没有解决这个问题。接受的答案还声称
NSAutoreleasePool已被弃用,苹果文档没有说明。 -
你确定这些电话实际上是在返回任何东西吗?即,您是否与基金会有关联?
-
@JoshCaswell 是的,
NSObject和NSAutoreleasePool都是有效对象(是的,我已链接到基金会) -
有趣...感谢您的确认。
标签: objective-c foundation objective-c-runtime nsautoreleasepool