Tag: nsautoreleasepool

NSAutoreleasePool。 什么时候适合创build一个新的自动释放池?

在iOS / CocoaTouch上,我经常看到代码在一个方法中创build一个新的NSAutoreleasePool实例。 我最近看到一个在NSOperation内。 设置NSAutoreleasePool的新实例的基本规则是什么? 为什么这样做比单纯依靠在main.m中创build的预先存在的发布池更好? 谢谢, 道格

Objective-C中的自动释放池 – 释放主要的AutoreleasePool?

根据我的理解,当一个对象被发送一个autorelease消息时,如果除main.m之外的其他自动释放池不存在,则该对象被放置在main.m中的一个。 假设这是正确的,我有几个问题: 1)是否所有的自动释放对象都停留在该池中,直到应用程序终止? 2)如果1是真的,是否创build一个没有本地自动释放池的自动释放对象(因此将该对象放在main.m池中)将该对象保存在内存中,直到应用程序终止或接收到内存警告为止? 3)什么时候main.m autorelease池耗尽,除了当应用程序收到内存警告或应用程序被终止? 例如,在这样的cellForRowAtIndexPath委托方法中: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"]; if (cell == nil) { // No cell to reuse => create a new one cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Foobar"] autorelease]; // lots of custom stuff } return cell; 细胞何时真的被释放? 他们必须自动发放,因为在你退还之前你不能释放他们,之后你也不能释放他们,因为他们超出了范围。 根据我目前的理解,这些单元格被放置在最顶层的自动释放池中,并在该池被排空/释放时被释放。 在这种情况下,这将是应用程序中唯一的自动释放池; main的一个。 4)这个问题,即使我已经完成了这些细胞和视图控制器已经释放,细胞留在记忆中,是吗? 如果情况并非如此,那么有人能够解释这种情况下的内存pipe理是如何工作的吗? 谢谢! 注意:我已经查看了苹果的文档,但主要讨论了何时使用自己的本地autorelease池,但没有太多关于它们如何实际运作。

为什么Xcode 4.2在main.m中使用@autoreleasepool而不是NSAutoreleasePool?

我注意到在Xcode 4.2中有一个不同的方法来启动主函数: int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([PlistAppDelegate class])); } } 和 int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } 有人知道这两者之间的区别吗?

运行结束循环 – autorelease池恢复

据我所知,autoreleased对象清理一旦释放autoreleased池。 现在,autorelease池将在运行循环结束时被释放。 我的问题是,如果在我的课上,我不创build一个自定义的autorelease池,并在该类的一些对象上调用autorelease方法,在什么时候将这些对象恢复? “运行循环的结束”是否意味着“应用程序的结束”?

使用@autoreleasepool降低峰值内存使用量

我在一个iPad应用程序上工作,这个应用程序有一个同步过程,在紧密的循环中使用Web服务和核心数据。 为了减less内存占用根据苹果的build议我分配和排出一个NSAutoreleasePool定期。 这目前工作很好,并没有目前的应用程序的内存问题。 但是,我打算转移到ARC, NSAutoreleasePool不再有效,并希望保持这种相同的性能。 我创build了一些例子并对它们进行了定时, 我想知道使用ARC来实现同样的性能并保持代码可读性的最佳方法是什么 。 出于testing目的,我想出了3个场景,每个使用1到10,000,000之间的数字创build一个string。 我运行了每个示例3次,以确定他们使用苹果LLVM 3.0编译器(w / o gdb -O0)和XCode 4.2使用Mac 64位应用程序花了多长时间。 我也通过仪器运行每个例子来大致了解记忆峰值。 以下每个示例都包含在以下代码块中: int main (int argc, const char * argv[]) { @autoreleasepool { NSDate *now = [NSDate date]; //Code Example … NSTimeInterval interval = [now timeIntervalSinceNow]; printf("Duration: %f\n", interval); } } NSAutoreleasePool批量[原始预ARC](峰值内存:〜116 KB) static const NSUInteger BATCH_SIZE = […]

NSThread现在自动创buildautoreleasepool吗?

我有这样的testing代码 – (void)viewDidLoad { [super viewDidLoad]; NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil]; [thread start]; } -(void)test { MyClass *my = [[[MyClass alloc] init] autorelease]; NSLog(@"%@",[my description]); } 我没有为我自己的线程创build任何autoreleasepool,但是当线程退出时,对象“我的”只是dealloc.why? 即使我改变我的testing代码如下 – (void)viewDidLoad { [super viewDidLoad]; NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil]; [thread start]; } -(void)test { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; […]

自动释放池以及在iOS下调用发行版的时间

我想澄清一些事情。 比方说,我有以下代码: – (void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; for (int i = 0; i < 5000000; i++) { NSString *s = [NSString stringWithFormat:@"Hello, %@!", @"World"]; } } 这将在此函数调用中创build500万个自动发布的string。 我期待这个保留这些对象,直到应用程序终止,因为我看到的唯一的@autoreleasepool是在main.m中包装应用程序实例的一个。 但事实并非如此。 在这个函数调用的结尾,似乎他们都获得了他们的发布,并从内存中删除。 这个文件: https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html “应用程序工具包在事件循环的每个循环开始时在主线程上创build一个自动释放池,并在最后耗尽它,从而释放处理事件时生成的任何自动释放对象。 这对我来说是有道理的,但这是在UIKit下,而不是Application Kit。 我的问题是,在这种情况下,UIKit / Cocoa Touch是否做了同样的事情,还是有我的对象获得释放的另一种解释? 谢谢!

使用ARC,是不是每个线程都有一个自动释放池是致命的?

我读过这个: 如果您在应用程序中创build了辅助线程,则需要为其提供自己的autorelease池。 Autorelease池及其包含的对象将在下文进一步讨论 在iOS 5 Developer Cookbook中。 我正在编译ARC。 我一直在创build很多后台线程,而且看起来我很好。 我的后台线程都不是长时间运行的。 所有这些对象是否会被释放,主线程的autorelease池? 或者是什么? 这就是我所做的调用后台线程: +(void)doBackground:(void (^)())block { //DISPATCH_QUEUE_PRIORITY_HIGH //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ dispatch_async(dispatch_get_global_queue(-2,0), ^{ block(); }); } 我应该改变它 +(void)doBackground:(void (^)())block { //DISPATCH_QUEUE_PRIORITY_HIGH //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ dispatch_async(dispatch_get_global_queue(-2,0), ^{ @autoreleasepool{ block(); } }); }