这真奇怪......
我运行我的应用程序,当它打开并且视图正在构建时,我得到:
Collection <CALayerArray: 0x124650> was mutated while being enumerated.
Run Code Online (Sandbox Code Playgroud)
代码跟踪经历以下内容:
main
UIApplicationMain
-[UIApplication _run]
CFRunLoopRunInMode
CFRunLoopRunSpecific
_UIApplicationHandleEvent
-[UIApplication sendEvent:]
-[UIApplication handleEvent:withNewEvent:]
-[UIApplication _runWithURL:sourceBundleID:]
-[UIApplication _performInitilizationWithURL:sourceBundleID:]
-[AppDelegate applicationDidFinishLaunching:]
+[Controller initializeController] //This is my own function
[window addSubview: pauseMenuController.view] //This is the last point of my code it goes through
-[UIView(Hierarchy) addSubview:]
-[UIView(Internal) _addSubview:positioned:relativeTo:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
_NSFastEnumerationMutationHandler
objc_exception_throw
Run Code Online (Sandbox Code Playgroud)
我经常玩很多很多次游戏而且我从来没有看过这个,然后它突然出现了.奇怪的是,我不是创建任何其他线程(据我所知),直到之后的代码都被调用.如果有人可以给我一些解释在UIView中访问时可能会被修改的内容,我会更容易调试这个.它是否与视图中添加内容有关,而它已经添加了一些内容,可能吗?有任何想法吗?
我正在尝试使用symbolicatecrash,并获得有趣的结果.同事在另一台机器上构建了我们的分发版,所以他给我发了dSYM文件.运行中找到的symbolicatecrash文件后
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
它填补了所有Apple功能,但不支持我的功能.问题似乎是它不能(或不会)找到dSYM文件,可能是因为它有我的同事的机器信息.当我从崩溃报告中复制十六进制地址时,我可以像这样使用dwarfdump:
dwarfdump --lookup 0x0001f892 --arch ARMv6的路径/到/ MyApp.app.dSYM
它正确地给了我单个呼叫的行号.此外,symbolicatecrash能够从我们的代码中计算游戏的行号,而不是Apple的.我不知道为什么他不能看到苹果的东西,但是这一切都使我相信这个问题是寻找的dSYM,如前所述.
所以.有没有什么办法,只是传递的dSYM的路径进入symbolicatecrash命令,或使其工作的一些其他的方式?因为,严肃地说,制作一个为你的文件做某种魔术"搜索"的工具是完全愚蠢的,但却因为它不想要而找不到它.
另外,任何想法为什么我的同事的构建不会显示Apple的任何功能?虽然我在这里,崩溃文件中的"+"是什么意思?像这样:
0x00059f8c - [UIWindow sendEvent:] + 108
我在Objective-C中有一行非常简单的代码:
if ((selectedEntity != nil) && [selectedEntity isKindOfClass:[MobileEntity class]])
Run Code Online (Sandbox Code Playgroud)
我偶尔也无缘无故地说,游戏在EXC-BAD-ACCESS的这行代码上崩溃了.它通常似乎是关于某些东西被从游戏领域中移除的时间,所以我猜测selectedEntity 是什么被 dealloc'd,然后这结果.除了是不可能选择退出实体(但谁知道,也许这实际上不是真正的在我的代码......),事实上,我特别检查,看看是否有是一个selectedEntity之前,我访问它意味着,我不该这里有任何问题.Objective-C应该支持布尔短约束,但似乎不是编辑:看起来像短路与问题无关.
另外,我在这个代码块周围放了一个@ try/@ catch,因为我知道它偶尔会爆炸,但是这似乎被忽略了(我猜测EXC-BAD-ACCESS无法捕获).
所以基本上我想知道是否有人知道我可以抓住这个并把它抛出的方式(因为我不关心这个错误,只要它不会让游戏崩溃)或者可以解释为什么它可能会发生.我知道Objective-C用"nil"值做了奇怪的事情,所以我猜它指的是一些既不是对象指针也不是nil的奇怪空间.
编辑:只是为了澄清,我知道下面的代码是错误的,这是我猜测在我的程序中发生的事情.我问这是否会导致问题 - 确实如此.:-)
编辑:看起来有一个边缘案例,允许您在删除之前选择一个实体.所以,似乎代码的进展如下:
selectedEntity = obj;
NSAutoreleasePool *pool = ...;
[obj release];
if (selectedEntity != nil && etc...) {}
[pool release];
Run Code Online (Sandbox Code Playgroud)
所以我猜测因为Autorelease池还没有被释放,所以对象不是nil,但是它的保留计数是0,所以不允许它被访问...或者沿着这些线路?
此外,我的游戏是单线程的,所以这不是一个线程问题.
编辑:我以两种方式修复了问题.首先,我不允许在该边缘案例中选择实体.其次,不是只调用[entities removeObjectAtIndex:i](删除任何将被删除的实体的代码),而是将其更改为:
//Deselect it if it has been selected.
if (entity == selectedEntity)
{
selectedEntity = nil;
}
[entities removeObjectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)
正如jib建议的那样,确保在释放变量的同时为变量分配nil.
我真的无法理解这个:
以前我无法让Framebuffers工作,但我现在已经开始了.然而,这种令人难以置信的奇怪镜像正在从帧缓冲器生成纹理,我不知道为什么.基本上,我将尝试使用GL_TRIANGLE_FAN在0,0处绘制纹理,并且纹理在右上角显示为正常(或多或少),但也出现在左下角,镜像.如果我用相同的纹理填充我的大部分或全部视口区域,结果是一个丑陋的z-fighting重叠.
屏幕截图将更加正义.
原始图片:
原文http://img301.imageshack.us/img301/1518/testsprite.png
绘制80x80 at(0,0)
80x80 http://img407.imageshack.us/img407/8339/screenshot20100106at315.png
在(0,0)绘制100x180
100x180 http://img503.imageshack.us/img503/2584/screenshot20100106at316.png
在(0,0)绘制320x480
320x480 http://img85.imageshack.us/img85/9172/screenshot20100106at317.png
这是我的代码:
设置视图:
//Apply the 2D orthographic perspective.
glViewport(0,0,320,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, 320, 480, 0, -10000.0f, 100.0f);
//Disable depth testing.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
//Enable vertext and texture coordinate arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glShadeModel(GL_SMOOTH);
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glGetError(); // Clear error codes
sprite = [Sprite createSpriteFromImage:@"TestSprite.png"];
[sprite retain];
[self createTextureBuffer];
Run Code Online (Sandbox Code Playgroud)
创建纹理缓冲区.
- (void) createTextureBuffer
{
// generate texture
glGenTextures(1, &bufferTexture);
glBindTexture(GL_TEXTURE_2D, bufferTexture);
glTexImage2D(GL_TEXTURE_2D, 0, …Run Code Online (Sandbox Code Playgroud) iphone ×4
objective-c ×2
crash-dumps ×1
fbo ×1
framebuffer ×1
nsexception ×1
opengl-es ×1
pointers ×1