好的,我在这里撞墙了。
我不知道为什么我的Xcode 4.5.2在崩溃之前说我使用了4.16 GB的内存:
ExampleEngine(11672,0xac70f2c0) malloc: *** mmap(size=4160753664) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
我使用Instruments运行我的OpenGL ES应用程序 - Leaks&分配。它显示我使用的分配内存总量是1.46 MB Live Bytes。
我正在尝试遵循Ian Terrel的OpenGL ES教程:
http://games.ianterrell.com/how-to-draw-2d-shapes-with-glkit-part-2/
我被EERegularPolygon
类的最后一部分所困(所有以前的形状,如Triangle,Rectangle,Elipse都工作得很好)。我的代码是这样的(与他略有不同,因为我正在使用Xcode 4.5.2的自动@synthesize
):
// EERegularPolygon.h file
#import "EEShape.h"
@interface EERegularPolygon : EEShape
@property (readonly) int numSides;
@property (nonatomic) float radius;
-(id)initWithNumSides:(int)numSides;
@end
// EERegularPolygon.m file
#import "EERegularPolygon.h"
#define M_TAU (2 * M_PI)
@implementation EERegularPolygon
-(id)initWithNumSides:(int)numSides
{
self = [super init];
if(self)
{
_numSides = numSides;
}
return self;
}
-(void)updateVertices
{
for(int i = 0; i < self.numSides; i++)
{
float theta = ((float) i) / self.numSides * M_TAU;
self.vertices[i] = GLKVector2Make(cos(theta) * self.radius, sin(theta) * self.radius);
}
}
-(void)setRadius:(float)radius
{
_radius = radius;
[self updateVertices];
}
@end
// HexagonScene.h file
#import "EEScene.h"
#import "EERegularPolygon.h"
@interface HexagonScene : EEScene
{
EERegularPolygon *polygon;
}
@end
// HexagonScene.m file
#import "HexagonScene.h"
@implementation HexagonScene
-(id)init
{
self = [super init];
if(self)
{
polygon = [[EERegularPolygon alloc] initWithNumSides:6];
polygon.radius = 1;
}
return self;
}
-(void)render
{
[super render];
[polygon render];
}
@end
// AppDelegate DidFinishLaunchingWithOptions: method
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:context];
GLKView *view = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds] context:context];
view.delegate = self;
GLKViewController *controller = [[GLKViewController alloc] init];
controller.delegate = self;
controller.view = view;
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = controller;
[self.window makeKeyAndVisible];
scene = [[HexagonScene alloc] init];
scene.left = -3;
scene.right = 3;
scene.bottom = -2;
scene.top = 2;
scene.clearColor = GLKVector4Make(0.25, 0.25, 0.25, 1.0);
return YES;
}
任何人都有任何想法为什么Xcode报告4.16 GB的内存试图被分配?
我尝试手动编写EERegularPolygon
类的get和set方法,但这也没有用。
答案 0 :(得分:0)
好的,在尝试调试问题后,我疯狂地偶然发现了解决方案。
首先,两个变化:
1)我忘记覆盖以下方法:
-(int)numVertices
{
return self.numSides
}
2)阻止应用程序崩溃并显示六边形的一条线就是这条NSLog()行:
-(id)initWithNumSides:(int)numSides
{
self = [super init];
if(self)
{
_numSides = numSides;
// ---------------------------------
// IF THIS LINE IS COMMENTED OUT,
// THE APP CRASHES,
//
// BUT IF THE LINE IS NOT COMMENTED
// THE APP WORKS, THE HEXAGON IS
// RENDERED TO SCREEN AS DESIRED
//
// I WANT TO KNOW WHY :(
// ---------------------------------
NSLog(@"M_TAU = %lf", M_TAU);
}
return self;
}
在上面的代码行中实际调用#define预处理程序指令之前,必定会有一些我不理解的事情。
任何C或Objective C大师都可以解释一下吗?
我也会挖谷歌,看看能不能理解为什么#define在上面的代码中调用NSLog之前无法工作。
除非它是编译器或Xcode的错误,否则看起来很荒谬。
好的,进一步的发现,并不是#define被打破了,我需要在init中调用M_TAU常量:
NSLog(@"M_TAU = %lf", M_TAU);
似乎我需要在我的init函数中有一行NSLog,原因有些奇怪,无论如何。