我很难定位内存泄漏。我正在使用 cocos2d。这是两个类的数据区域:
@interface Dungeon : CCLayerColor {
DungeonLevel *aDungeonLevel;
Player *thePlayer;
// list of all monster file names
NSMutableArray *monsterNames;
// array of how many monsters there are of each monster level
NSMutableArray *monsterLevels;
MessageView *theMessageView;
DungeonDisplay *theDisplay;
bool processing;
int currentDungeonLevel;
}
@interface DungeonDisplay : CCLayerColor {
NSMutableArray *displayGrid;
NSMutableArray *displayGrid2;
NSMutableArray *displayGrid3;
NSMutableArray *displayGrid4;
NSMutableArray *dungeonMatrix;
NSMutableArray *monsterSprites;
Dungeon *theDungeon;
int xdelt;
int ydelt;
CGPoint lowerLeft;
Player *thePlayer;
CCSprite *playerSprite;
CCSprite *mSprite1;
ButtonsLayer *buttonArea;
double previousTime;
double currentTime;
double touchTimePrev;
bool touchFlag;
bool processing;
bool processing2;
bool animating;
bool flipSprite;
bool doIdleAnimation;
bool isAttacking;
int firstIteration;
CGPoint dungeonOriginalPosition;
CGPoint playerOriginalPosition;
CGPoint mSprite1Original;
CGPoint buttonOriginal;
CCTimer *myTimer;
// List of Messages
NSMutableArray *messages;
int messageIndex;
// player transparency level
int transparency;
// indicates that walls need to become transparent
bool needTransparency;
int pXInc;
int pYInc;
int tempx;
int tempy;
// debugging variables
CCLabelTTF *debugLabel1;
CCLabelTTF *debugLabel2;
// the Map
MiniMap *aMap;
}
好的,现在 Dungeon 对象通过与另一个对象 DungeonLevel 交互来创建 DungeonDisplay 对象(我认为这与弄清楚为什么 DungeonDisplay 未被释放没有特别相关)。这是创建“单例”DungeonDisplay 对象的所有代码:
-(void) displayDungeon
{
if (!theDisplay) {
theDisplay = [[DungeonDisplay alloc]init];
[self addChild:theDisplay z:101];
[theDisplay letTheDungeon:self];
}
else {
[thePlayer placePC:thePlayer.pCLocation];
[theDisplay displayStructure];
}
theDisplay.visible = true;
aDungeonLevel.visible = NO;
}
出于某种原因,在 addChild(一种 cocos 方法)之后,保留计数跳转到 4(从 1)。 “letTheDungeon”对保留计数没有影响(正如预期的那样)。
最佳答案
问题:“我很难定位内存泄漏。...有没有人有关于增加和减少保留计数的特定事物的完整列表?”
答案:哇,很多东西。仅关注增加保留计数的内容,它包括:添加 subview ;推送/呈现 Controller ;添加到字典和数组;名称以 alloc、new、copy 或 mutableCopy 开头的任何方法;任何 retain 调用;在 viewDidLoad 中以非 ARC 代码创建对象并忽略在 dealloc 中清理它们;在非 ARC 代码中的一个指针中分配另一个新对象,该指针已经指向尚未发布的项目;名称中带有create 或copy 的任何核心基础函数;等等。这可能只是表面现象。减少保留计数的列表同样长。
无意冒犯,这不太可能是追踪泄漏的有效途径。 (这就像说有人在曼哈顿被 Gunicorn ,所以让我们列出东海岸所有持枪的人。)我建议您更多地采用 CSI 方法:
通过 Xcode static analyzer 运行您的代码.在您解决所有这些问题之前,没有任何进一步研究的意义。您应该从静态分析中得到零 警告。
使用分析器工具 find the leak .一旦您学会了如何使用该工具,它通常可以准确地向您显示导致泄漏的对象和代码行,此时解决起来就容易多了。
确保您完全阅读并理解Advanced Memory Management .如果您正在使用核心基础做任何事情,请查看 Memory Management Programming Guide for Core Foundation .
如果您不使用 ARC,请开始放入检查各种对象的 retainCount 的调试消息。
如果您发现一段代码泄漏,如果您无法弄清楚,请将有问题的代码发布到 StackOverflow 上(请务必告诉我们它是否是 ARC),我们可以帮助您进一步诊断.
我真的不想刻薄,但就目前而言,这个问题太宽泛了,我们无法帮助您(即使理论上有人可以为您提供全面的答案,我也无法想象对你有帮助)。不过,希望上面的一些提示能为您指明正确的方向。
我真的很理解你的沮丧。您决定要认真追踪泄漏的第一个项目是一项痛苦的练习。您必须掌握 Objective-C 内存管理的重要领域,并学习一些非常复杂的工具(尤其是分析器)。但是一旦你在一个大项目中完成了一次练习,并掌握了这些工具,你就会有那种“啊哈”的感觉,追踪内存泄漏将成为一个简单的(或者至少是有条不紊的)过程。
关于objective-c - 影响保留计数的因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11166982/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中