Tag: 自动ref counting

iOS内存警告发送到解除分配的UIViewController

我有奇怪的行为。 我的应用程序正在使用UINavigationController启动。 如果我推视图控制器ANavigationController ,回去模拟内存警告一切正常。 如果我以相同的方式推动相同的视图控制器( ANavigationController ),请返回并模拟内存警告 – 应用程序崩溃,错误: [ANavigationController retain] :发送到释放实例的消息。 在debugging时,我打印了推送控制器的地址并释放了一个地址: 在第一个推送控制器地址是0xDA724F0 。 如果我回去模拟记忆警告 – 一切都好。 调用地址为0xDA724F0第二个push- –dealloc方法。 新推控制器地址是0xFA720F0 。 回去并模拟内存警告崩溃与错误: [ANavigationController retain] :发送到解除分配的实例0xDA724F0消息。 为什么释放控制器(在步骤4)根本得到内存警告信息? 编辑 我正在使用ARC。 编辑 运行仪器来testing分配和启用NSZombie我在预期的地方崩溃,但是在UIkit库和负责调用者报告的-1引用计数是: + [UIViewController _traverseViewControllerHierarchyWithDelayedReleaseArray:block:]

内存泄漏iOS(UIImageView,UIImage,CGImage)没有在ARC上释放

我试图实现一个简单的videostream,但由于某种原因,我的记忆将不会被释放: (void)updateImage:(UIImage *)image{ self.indicator.hidden = TRUE; //CGImageRelease([self.imageView.image CGImage]); self.imageView.image = nil; self.imageView.image = image; [self.imageView setNeedsDisplay]; } 如果我使用 CGImageRelease([self.imageView.image CGImage]); 内存将被释放。 但是,当我回到以前的视图控制器应用程序将崩溃,因为它试图释放为我已经释放的图像分配的内存。 这个方法是从asynchronous任务中调用的,它使用下面的命令创build一个图像: UIImage *image = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); CGDataProviderRelease(provider); CFRelease(data); 据我了解,UIImage现在拥有CGImage,我不应该释放它。 那么无论如何,当我用新的图像更新UIImageView时,确保UIImage被释放?

过渡到ARC导致委托问题

在将项目转换到ARC之后,我一直在委托方法上没有被调用/被调用的问题。 我意识到,问题是我有一个variables被分配,然后执行一个asynchronous任务。 举一个简单的例子,假设有一个名为MyService的对象响应委托方法executeDidSucceed: – (void)fireRequest { MyService *service = [[MyService alloc] initWithDelegate:self]; [service execute]; } 原来的代码看起来像这样: – (void)fireRequest { MyService *service = [[[MyService alloc] initWithDelegate:self] autorelease]; [service execute]; } 使用ARC,我明白在调用[service execute]之后会添加一个release调用。 而且我也明白,因为这个方法是asynchronous的, service对象将被释放,并且将为委托方法调用解除分配的对象。 我知道一个解决办法就是把service变成一个实例variables,并给它strong属性,这样我们就可以保留它的所有权。 我知道一个解决scheme,我们可以创build一个块,并使用一个完成处理程序,这样委托保持保留,直到块完成。 我的问题是,处理这种情况的最好办法是什么? 或者更多,在过渡到ARC时解决这个问题的“最佳实践”是什么?

更新为ARC错误

我正在尝试将一个项目更新到ARC。 虽然我已经看到更新到ARC的几个post,但我没有看到任何post处理这个特定的问题。 我有很多错误,大多数人说: ARC Issue Pointer to non-const type 'id' with no explicit ownership 指着线 CCARRAY_FOREACH(children_, item) 在CCMenu.m类中。 请帮忙。 更新: 重新启动Xcode后,上面的问题不再被发现 CCARRAY_FOREACH(children_, item) 但是在ccCArray.h类中我发现了这些行 // Arc Issue 还有其他几个错误。 警告标志: Arc Issue Destination for this '_builtin__memmove_chk' call is a pointer to ownership-qualified-type 'autoreleasing-id' 出现在代码中调用memmove的地方。 另一个错误: ARC Casting Rules Implicit conversion of C pointer type 'void *' […]

我怎么能一次添加很多文件的-fobjc-arc

我想将xmppframework添加到我的项目中,我怎样才能将-fobjc-arc添加到所有xmpp文件中?

当视图控制器被解散时,是否应清空内存?

我想了解Objective-C中的内存pipe理,我觉得这不是那么容易,因为我在Objective-C和ARC方面相当新颖,而且我大多用来编写我不需要处理的语言内存pipe理很多(或根本不)。 我正在处理的应用程序是按下button后,代码呈现viewController(附带xib文件)。 在这个视图控制器中,我有几个实例化的视图; 我logging了一系列图像(照片的相机,保存到磁盘),我转换成电影,我有一个GPS屏幕上的一个小地图的GPS跟踪器(mapKit)。 毕竟,我可以推一个“完成”button,调用[self dismissViewControllerAnimated:YES completion:nil]; viewController被animation回到我的rootViewController,因为我把一个NSLog消息放在viewController中的dealloc方法里,这个方法被解散了,我可以确认这个viewController被释放了。 问题是,我看到使用该应用程序后的记忆上升(用法包括在MapKit地图上拍摄照片和loggingGPS位置,以及生成一个电影文件)约80 MB,当我按下时,这将下降到约70MB '完成',所以viewController解散,应用程序返回到我的rootViewController。 我可以再次展示相同的viewController,使用它并closures它,应用程序仍然会占用大约70MB的内存,不会掉落。 这看起来不像是一个内存泄漏,因为在那种情况下,我希望每一个实例化和解除viewController的内存稳步增长。 即使我在我的rootViewController中有不同的button,但并不是这种情况,它们都实例化了我的viewController类的一个新的唯一实例。 我想知道:有什么我应该找的或是这种预期的行为? 也许应用程序caching类以备将来使用? 随着内存pipe理的完成,我应该期待一个应用程序恢复到“处女”的内存状态(在这种情况下,这将是4 MB左右)解除唯一的viewController提交?

过渡到ARC的工具

我想将我的应用程序转换为ARC 。 我可以将Objective-C Automatic Reference Counting更改为YES但不会自动删除release的retain等。 过渡到ARC发行说明指出: Xcode有一个新的工具,可以自动化ARC转换的机械部分(例如删除保留和释放调用),并帮助您解决迁移器无法自动处理的问题。 迁移工具将项目中的所有文件转换为使用ARC。 如果您对某些文件使用手动引用计数更方便,也可以select在每个文件基础上使用ARC。 我如何在Xcode中调用这个工具?

在ARC下将对象安全地作为不透明的上下文parameter passing

在手动内存pipe理下,我经常使用这个模式: NSString * myStr = /* some local object */ [UIView beginAnimation:@"foo" context:(void *)[myStr retain]]; 然后,后来和asynchronous: – (void)animationDidStop:(NSString *)anim finished:(NSNumber *)num context:(void *)context { NSString * contextStr = (NSString *)context; // … [contextStr release]; } 即我手动pipe理用作不透明上下文的对象的生命周期。 (对于旧的UIViewanimation,对于其他types的API也是如此。) 在ARC下,我的本能就是我想要__bridge_transfer在处理程序中进入__bridge_transfer , 正如这里所build议的那样 。 但是这把cocoa物体当作CFType并不是因为它是真的桥接的,而仅仅是为了把一个可卡因放在喉咙里。 这是否有效,这在风格上是可以接受的? 如果没有,最好的解决scheme是什么? ( 在这个问题上接受的答案给出了一个不同的答案,说只有__bridge是可以的,但是在我看来是错误的,因为原来的string在第一个__bridge就有可能被释放function,对吗?) *请不要说“改为使用基于块的animation”。 (这不是我问的。)

什么是从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支付代价似乎太过分了。 有什么想法吗? 谢谢。

自动引用计数:快速枚举时出错

在更新下面的代码以使用iOS 5自动引用计数时,当尝试执行快速枚举时将“state-> itemPtr”分配给缓冲区时会发生错误,以便可以使用“foreach”循环迭代实现类。 我得到的错误是“指定'__autoreleasing id *'为'__unsafe_unretained id *'更改指针保留/释放属性”。 查看带注释的代码行。 /* * @see http://cocoawithlove.com/2008/05/implementing-countbyenumeratingwithstat.html * @see http://www.mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html */ – (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (id *)buffer count: (NSUInteger)bufferSize { NSUInteger arrayIndex = (NSUInteger)state->state; NSUInteger arraySize = [_tuples count]; NSUInteger bufferIndex = 0; while ((arrayIndex < arraySize) && (bufferIndex < bufferSize)) { buffer[bufferIndex] = [_tuples objectAtIndex: arrayIndex]; […]