2013-10-31 51 views
4

我一直在試圖解決這個問題一段時間,並不能解決它爲什麼發生。這似乎只發生在「歸檔」應用程序並在設備上運行時,而不是在調試應用程序時發生。當包含它的對象不可用時,該成員變量的地址如何在objective-c中更改?

我有兩個類:

@interface AppController : NSObject <UIApplicationDelegate> 
{ 
    EAGLView * glView; // A view for OpenGL ES rendering 
} 

@interface EAGLView : UIView 
{ 
@public 
    GLuint framebuffer; 
} 

- (id) initWithFrame:(CGRect)frame pixelFormat:(NSString*)fformat depthFormat:(GLuint)depth stencilFormat:(GLuint)stencil preserveBackbuffer:(bool)retained scale:(float)fscale msaaMaxSamples:(GLuint)maxSamples; 

,我intitializing一個對象像這樣:

glView = [ EAGLView alloc ]; 
glView = [ glView initWithFrame:rect pixelFormat:strColourFormat depthFormat:iDepthFormat stencilFormat:iStencilFormat preserveBackbuffer:NO scale:scale msaaMaxSamples:iMSAA ]; 
NSLog(@"%s:%d &glView %p\n", __FILE__, __LINE__, glView); 
NSLog(@"%s:%d &glView->framebuffer %p\n", __FILE__, __LINE__, &glView->framebuffer); 

隨着initWithFrame看起來像:

- (id) initWithFrame:(CGRect)frame 
    /* ... */ 
{ 
    if((self = [super initWithFrame:frame])) 
    { 
     /* ... */ 
    } 
    NSLog(@"%s:%d &self %p\n", __FILE__, __LINE__, self); 
    NSLog(@"%s:%d &framebuffer %p\n", __FILE__, __LINE__, &framebuffer); 

    return self; 
} 

日誌顯示:

EAGLView.mm:399 self 0x134503e90 
EAGLView.mm:401 &framebuffer 0x134503f68 
AppController.mm:277 glView 0x134503e90 
AppController.mm:281 &glView->framebuffer 0x134503f10 

當包含它的對象不存在時,這個成員變量的地址如何改變?

+0

當yu打印它時,是否在init方法中分配了framebuffer? –

+0

framebuffer只是一個unsigned int成員,我不認爲我需要「分配」它嗎? – ashleysmithgpu

+0

不,可能只是iOS映射這些變量的一種方式,我認爲很難找到「正確」的解釋 –

回答

1

爲什麼不使用指針呢?你保證地址是一樣的。修改EAGLView要像

@interface EAGLView : UIView 
{ 
@public 
    GLuint *framebuffer; 
} 

打印出來的地址framebuffer爲:

NSLog(@"%s:%d &glView->framebuffer %p\n", __FILE__, __LINE__, glView->framebuffer); 

而且裏面initWithFrame做這樣的事情:

- (id) initWithFrame:(CGRect)frame 
{ 
    unsigned int fbo= opengl_get_framebuffer(); 
    framebuffer = &fbo; 
    NSLog(@"%s:%d &framebuffer %p\n", __FILE__, __LINE__, framebuffer); 
} 

現在的framebuffer的地址應該是一樣!

相關問題