0

OK、ここで壁にぶつかっています。

Xcode4.5.2がクラッシュする前に4.16GBのメモリを使用していると言っている理由がわかりません。

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-Leaks&Allocationsを使用してOpenGLESアプリケーションを実行しました。これは、使用した割り当てメモリの合計量が1.46MBライブバイトであることを示しています。

IanTerrelによるOpenGLESチュートリアルに従おうとしています。

http://games.ianterrell.com/how-to-draw-2d-shapes-with-glkit-part-2/

私はEERegularPolygonクラスの最後の部分で立ち往生しています(三角形、長方形、楕円などの以前のすべての形状は正常に機能しました)。私のコードは次のようになっています(Xcode 4.5.2のautoを使用しているため、彼とは少し異なります@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.16GBのメモリを割り当てようとしていると報告している理由を誰かが知っていますか?

クラスのgetメソッドとsetメソッドも手動で作成しようとしましたEERegularPolygonが、それも機能しませんでした。

4

1 に答える 1

0

OK、問題をデバッグしようとした後、魔法のように解決策に出くわしました。

まず第一に、2つの変更:

1)次のメソッドをオーバーライドするのを忘れました:

-(int)numVertices 
{ 
    return self.numSides 
}

2)アプリがクラッシュするのを防ぎ、六角形を表示する1つの行は、次の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またはObjectiveCの第一人者は説明できますか?

上記のコードでNSLogが呼び出されるまで、#defineが機能しない理由を理解できるかどうかを確認するために、Googleも掘り下げます。

コンパイラまたはXcodeのバグでない限り、それ以外の場合はばかげているように見えます。

編集

OK、さらに発見しました。#defineが壊れていたわけではなく、initで次のようにM_TAU定数を呼び出す必要がありました。

NSLog(@"M_TAU = %lf", M_TAU);

なんらかの奇妙な理由で、init関数内にNSLogの行が必要なようです。

于 2012-12-12T07:07:56.110 に答える