Tag: autorelease

什么是从autoreleasepool块内设置NSError outparam的正确方法?

我有这样的一个方法: – (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error { @autoreleasepool { // Start processing. // Find some partway through error.. if (error) { *error = [NSError errorWithDomain…]; return NO; } // More processing. } } 这是破坏和崩溃,因为NSError是autoreleased,并且当返回发生时,池被耗尽,所以调用者得到的东西现在是假的。 我知道我可以重新devise方法,所以我收集autorelease块外的所有错误情况,但我想了解在这种情况下是否有正确的方式来处理错误对象。 我不能在池块之​​外分配/初始化一个推测NSError,因为域和代码属性是只读的(我仍然认为引用在方法返回时会消失)。 它解决了这个问题,如果我更改方法声明: – (void)processAThing:(id)thing error:(NSError * __strong *)error 但是接下来我需要以非标准的方式在呼叫站点大惊小怪,而这让调用者为我的内部autoreleasepool支付代价似乎太过分了。 有什么想法吗? 谢谢。

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池,但没有太多关于它们如何实际运作。

内存pipe理,自动释放,永久堆的问题有时在iOS上250+ kb

我真的把我的头发拉出来,看起来我在iOS应用上遇到了内存pipe理方面的严重问题。 这里的情况是:首先我加载表。 当用户点击一个单元格时,呈现一个复杂的视图。 消耗大部分视图的内存是加载了20个500×500的UIImage 。 在该视图中还有两个选项卡,加载一个媒体列表(那些UIImage ,然后在一个表格中)和另一个简单的表格。 当我返回到第一个表格视图时,显然超过250 kB仍然分配在堆上。 我知道这个观点很复杂,但是没有理由保持这么多的记忆。 还有,猜猜看,当我切换到视图很多,最终应用程序耗尽内存并被杀害。 我试图解决它: 修复所有的分析问题,所以根据这个,没有泄漏了。 再次检查所有的init ,释放,尽可能使用autorelease 。 使用“仪器 – >泄漏”检查所有内存泄漏。 在6的运行时间,我得到不超过2或3个泄漏。 最后,仪器 – >分配,检查堆。 这是困扰我的两个标记的堆积之间,我得到了250 + kB的差异。 我已经看过它,使用详细的意见。 我无法理解它:当它指向我的一个方法/类时,我很确定那里的所有东西都是释放或者自动释放的。 它也指向了很多不是我的(比如说QuartzCore )的方法/类。 另外,我不明白为什么autorelease不autoreleasing。 我的意思是,它有时看起来像是一个被标记为自动释放的对象,释放的方式太晚了。 我自己还没有创build任何NSAutoreleasePool ,所以只有在运行时停止时,池才有可能被排空? 我怎样才能定期排空泳池(即使不是我的)。 任何帮助是极大的赞赏。 亲切的问候, 雷因德 用于堆检查: http : //www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable -Memory生长/

为什么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?

我看到在一些示例代码中使用autorelease 。 我不熟悉需要的情况。 例如,如果我创build一个注释对象 头文件 @interface someViewController: UIViewController { Annotation *annotation; } @property (nonatomic, retain) Annotation *annotation; @end 实施文件 @implementation someViewController @synthesize annotation @end 问题:如果我像这样初始化实现文件中的注释对象,是否是正确的方法? self.annotation = [[Annotation alloc] initWithCoordinate:location]; 我需要为此设置autorelease吗? 或者我可以按照正常的方式做,并在dealloc方法中添加发行版?

有没有办法创build一个NSDecimal而不使用NSNumber和创build自动释放对象?

我正在使用NSDecimal进行一些计算,并使用以下技术创build每个NSDecimal结构: [[NSNumber numberWithFloat:kFloatConstant] decimalValue] 我正在使用NSDecimal来避免使用自动释放的NSDecimalNumber对象(如果使用NSDecimalNumber方法来精确计算)。 但是,似乎NSNumber创build机制也返回提取十进制值的自动释放的NSNumber 。 有没有办法创build一个NSDecimal而不使用NSNumber和创build自动释放对象?