Tag: 内存pipe理

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

我想了解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提交?

内存警告和创buildPDF时崩溃

当生成一个大的PDF时,我的应用程序会向内存发出一个警告,然后在PDF的生成过程中崩溃。 PDF被绘制成网页视图,当页面达到一定数量(取决于设备)时,内存不足 我对这个问题的研究到目前为止让我明白我需要: 将UIGraphicsBeginPDFContextToData更改为IGraphicsBeginPDFContextToFile 创build一个合理的path到临时文件, 给那个函数, 将文件放到webview中加载。 完成后删除文件。 问题是,虽然我认为我只是在主要地方掌握它,但是我不知道如何去实现这个目标,或者完全理解它,以便在我的代码中实现它。 在这个问题上的build议非常appricated 我也打开任何其他的想法来阻止内存崩溃 @interface ICPDFPreviewController () @property (nonatomic, strong) Certificate *certificate; @property (nonatomic, strong) NSData *pdfData; @property (nonatomic) BOOL viewHasUnloaded; – (void)generatePdf; – (void)pdfDone:(NSData *)data; – (NSData *)createPdfWithPages:(NSArray *)pages; @end @implementation ICPDFPreviewController @synthesize certificate=_certificate; @synthesize scrollView=_scrollView; @synthesize webView=_webView; @synthesize pdfData=_pdfData; @synthesize viewHasUnloaded=_viewHasUnloaded; – (void)generatePdf { NSMutableArray *pagesArray […]

内存泄漏时保留财产

我正在尝试在每个button上单击我的应用程序发出一个点击声音为此,我创build了一个实用程序类的.h和.m如下 .h文件 @interface SoundPlayUtil : NSObject<AVAudioPlayerDelegate,AVAudioSessionDelegate> { AVAudioPlayer *audioplayer; } @property (retain, nonatomic) AVAudioPlayer *audioplayer; -(id)initWithDefaultClickSoundName; -(void)playIfSoundisEnabled; @end .m文件 @implementation SoundPlayUtil @synthesize audioplayer; -(id)initWithDefaultClickSoundName { self = [super init]; if (self) { NSString* BS_path_blue=[[NSBundle mainBundle]pathForResource:@"click" ofType:@"mp3"]; self.audioplayer =[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:BS_path_blue] error:NULL]; [self.audioplayer prepareToPlay]; } return self; } -(void)playIfSoundisEnabled { if ([[NSUserDefaults standardUserDefaults] boolForKey:soundStatus]==YES) { [self.audioplayer […]

iOS不断增长的内存使用

我目前正在开发一个我刚刚开始的游戏。 进展是好的,一切运行顺利,但我决定尝试使用XCode仪器来检查我的代码中的任何泄漏。 我正在使用ARC,只有当其他人被删除(我的游戏的内部工作的一部分)时才添加新的对象,但总的内存大小不断增长,因为它运行。 我的游戏是完全程序化生成的,不需要资产,它也只使用一个只与颜色映射的多边形多边形,所以没有纹理。 我预计它应该只需要几MB来运行(它开始),但它只是在不断增长。 现在,我注意到一些有趣的事情…大部分数据的用途是一个名为IOAccelResource的条目。 这很奇怪,因为我不使用任何加速度计/陀螺仪/指南针数据。 我甚至没有在我的项目中引用CoreMotion框架。 数据的第二个主要用途是四个不断增长的malloc集合。 还有一些保持相对相同。 这两个条目不被认为是程序泄漏。 当我告诉XCode分析我的代码时,并没有指出任何问题。 所有其他条目都非常小,并围绕同一点波动,或保持不变。 这是一个麻烦的条目的截图: 有什么build议?

什么时候应该从closures的ViewController类中观察持续的Model类调用removeObserver:forKeyPath?

我有一个ViewController类,它有一个属性,我想在模型更改上观察属性。 在我的模型对象中,我有一个在我的应用程序的背景中定期更新的属性。 随着更新,我需要在我的ViewController执行代码。 为此,我在ViewController viewDidLoad方法中创build了一个观察者模型。 [ModelObject addObserver:self forKeyPath:@"State" options:NSKeyValueObservingOptionNew context:nil]; 正如你所看到的,这没有什么特别的,观察方法的行为,只要我离开我的屏幕上显示的视图。 如果我从父视图中删除上述视图,当我的ModelObject实例Mode属性更改时,我得到一个EXC_BAD_ACCESS错误消息。 具体来说,我的应用程序在更新Mode属性的行上崩溃,并且我在ModelObject实例内的以下代码行上收到最没用的EXC_BAD_ACCESS。 //This is located in a method that periodically toggles the value of "State" [self setState: 2]; 我会假设这个问题的解决scheme是从我的ViewController某个地方调用[ModelObject removeObserver: self forKeyPath:@"State"] ,当它从它的父级子视图数组中移除时。 不过,我在viewDidUnload方法中添加了一行代码,但是我发现viewDidUnload方法没有被调用。 我不确定这是否是正确的地方,但它需要去哪里。 我可能做错了什么? 我知道问题是KVO相关,因为如果我删除了观察,应用程序工作没有任何问题。 我的模型实例可以根据需要切换这个值,我的应用程序也不会崩溃。 我应该怎么做才能确保观察视图从其父视图的子视图中被移除时,我的观察者被正确地移除了?

避免UIImage的imageNamed – 内存pipe理

我正在通过这个链接,我碰到一个点避免UIImage的imageNamed 。 为什么我们应该避免这个? 谢谢, 尼蒂什

用仪器分析内存泄漏 – iPhone 4和iOS 5 Simulator之间的巨大差异

在使用Instruments(寻找内存泄漏)分析我的应用程序时,我使用运行iOS 5的iPhone 4获得的结果与使用iOS 5 iPhone Simulator的结果截然不同。第一张图显示了使用真实设备进行分析的结果,第二个是模拟器: 真实的设备: iOS 5模拟器: 在这两种情况下,此configuration文件在应用程序中都处于相同的位置:在rootViewController的视图生命周期中完成viewDidLoad。 我已经等待了他们的总分配内存稳定。 正如您在设备图表中看到的,在00:10左右会出现一些极端的波动,这在模拟器中是不存在的。 在真实的设备上,00:08左右的总分配内存从1MB跳到3.5 MB,然后跳回到1.5 MB,最后跳到4.74稳定。 为模拟器分配的内存更加线性,稳定并迅速攀升至2.35 MB左右。 另外需要注意的是设备上存在2.25 MB分配的内存,而不是来自malloc的模拟器和CFNumber的700+ KB。 由于我使用仪器和分析相对较新,我不确定这是否正常。 一个快速的谷歌search没有什么明确的。 2.25 MB和700 KB以上弥补了内存分配的差异。 为了平衡,在模拟器testing中存在不同数量的内存的malloc中有更多的项目不存在于设备testing中。 此外,我发现,当第二个UIViewController被推到UINavigationController堆栈上时,分配的内存会跳到真实设备上的大约8.5-9 MB,但在模拟器上只有大约4.5到大约4.5兆字节。 我知道这是预计该设备将执行与模拟器有很大的不同,但内存分配不是很相似,因为相同的代码在两个设备上运行? 我会明白,如果这是一个性能分析,但内存分配,似乎这些数字应该是非常相似的。 谁能说清楚这是否正常?

removeFromSuperview后释放UIView崩溃的应用程序

我有一个UIView对象,我添加它作为一个子视图它使用[self.view addSubview:mySubView]; 。 之后我打电话给[mySubView removeFromSuperview]; 然后我尝试做[mySubView release]; 但应用程序崩溃在这里。 RemoveFromSuperview是否RemoveFromSuperview调用release ?

iPhone应用程序崩溃 – 错误消息发送到解除分配的实例0xa58a950

我在我的iPhone应用程序,我已经实施侧边栏即JTRevealSideBar显示侧边栏像Facebook应用程序的左侧但问题是,它是第一个索引,而其他索引点击后崩溃,它是完美的工作 崩溃日志[sidebarViewController:didSelectObject:atIndexPath:]:发送到释放实例0xa58a950的消息 – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (self.sidebarDelegate) { SALSideBarViewCell * cell = (SALSideBarViewCell*)[tableView cellForRowAtIndexPath:indexPath]; NSObject *object = cell.titleLabel.text; [self.sidebarDelegate sidebarViewController:self didSelectObject:object atIndexPath:indexPath]; } } – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"sidecell"; NSString * cellText; SALSideBarViewCell * salcell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (salcell == nil) { salcell = […]

目标C:ViewController中的GestureRecognizer – >保留周期?

我有一个我的ViewControllers(VC)的头文件中定义的以下属性: @property(nonatomic, retain) IBOutlet UIImageView *articleImageView1; 在VC的实现中,在方法viewDidLoad ,我将TapRecognizers附加到以下属性: UITapGestureRecognizer *captureImage1TapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self [self.articleImageView1 addGestureRecognizer:captureImage1TapRecognizer]; VC UIImageView 。 这个UIImageView是否也通过GestureRecognizer强有力地包含了VC? 这是一个保留周期的经典例子吗? 如果是这样,这是正确的解决scheme? -(void)viewDidUnload { … [self setArticleImageView1:nil]; … [super viewDidUnload]; }