bonjour, je suis en train de me faire une petite appli en objective C/cocoa et j'ai un probleme : on dirait qu'un pointeur disparait...
je m'explique :
j'ai 2 classes a et b, et dans a il y a une référence sur b
dans b il y a une méthode "afficher 'bonjour' à l'écran"
à l'initialisation de a, je donne le pointeur sur b. il peut demander à b d'afficher 'bonjour'
mais plus tard... il ne peut plus
j'ai réduit mon code au strict minimum, soit 30 lignes. et je ne fais pas d'affectations ni rien. le dealloc() ne s'exécute pas non plus
bref ca me rend fou. mais je suis inexpérimenté, donc si vous avez déja eu le meme probleme... merci de m'aider !!
En espérant avoir aiguisé votre curiosité...
Thomas
(P.S : a propos, si on veut avoir un classe "jeu", "controleur", "myview", doit on tout iniialiser depuis le controleur ? je ne vois pas vraiment où est la fonction main, ou alors s'il y a un endroit un peu plus global pour créer des instances. le controleur c'est pratique à cause de IB qui le fait)
code :
ca c'est la classe 'b', et recoitclic affiche qqchose. normalement.
@class MyView;
@interface Partie : NSObject {
MyView* dessin;
}
-(Partie*) initMyView*) window;
-(void) recoitclic;
-(void) dealloc;
@end
#import "Partie.h"
#import "MyView.h"
@implementation Partie
-(Partie*) initMyView*) window {
dessin = window;
//[MyView init];
return self;
}
-(void) recoitclic {
NSLog(@"clic\n");
}
-(void) dealloc {
NSLog(@"dealoc\n");
[super dealloc];
}
@end
ca c'est la classe 'a' :
@class Partie;
@interface MyView : NSOpenGLView {
Partie* master;
}
- (MyView*) init;
- (void) setMasterPartie*) parti;
- (void) drawRect: (NSRect) bounds;
- (void) mouseUpNSEvent *)theEvent;
@end
#import "MyView.h"
#include <OpenGL/gl.h>
#import "Partie.h"
@implementation MyView
-(void) setMasterPartie*) parti {
master = parti;
[master recoitclic];
}
- (MyView*) init{
return self;
}
-(void) drawRect: (NSRect) bounds {
}
-(void)mouseUpNSEvent *)theEvent {
NSLog(@"coucou\n");
[master recoitclic];
}
@end
et le controleur :
@class Partie, MyView;
@interface Controleur : NSObject {
IBOutlet NSButton* bouton_start;
IBOutlet MyView* window;
Partie* game;
}
-(IBAction)nouvellepartieid) sender;
@end
#import "Controleur.h"
#import "Partie.h"
#import "MyView.h"
@implementation Controleur
-(IBAction)nouvellepartieid) sender {
[bouton_start setHidden:YES];
window = [[MyView alloc] init];
game = [[Partie alloc] init:window];
[window setMaster:game];
[game retain]; // à mettre ? mis ou pas, ca ne marche pas
}
@end
tout est a chaque fois mis dans 2 fichiers .h et .m
je m'explique :
j'ai 2 classes a et b, et dans a il y a une référence sur b
dans b il y a une méthode "afficher 'bonjour' à l'écran"
à l'initialisation de a, je donne le pointeur sur b. il peut demander à b d'afficher 'bonjour'
mais plus tard... il ne peut plus
j'ai réduit mon code au strict minimum, soit 30 lignes. et je ne fais pas d'affectations ni rien. le dealloc() ne s'exécute pas non plus
bref ca me rend fou. mais je suis inexpérimenté, donc si vous avez déja eu le meme probleme... merci de m'aider !!
En espérant avoir aiguisé votre curiosité...
Thomas
(P.S : a propos, si on veut avoir un classe "jeu", "controleur", "myview", doit on tout iniialiser depuis le controleur ? je ne vois pas vraiment où est la fonction main, ou alors s'il y a un endroit un peu plus global pour créer des instances. le controleur c'est pratique à cause de IB qui le fait)
code :
ca c'est la classe 'b', et recoitclic affiche qqchose. normalement.
@class MyView;
@interface Partie : NSObject {
MyView* dessin;
}
-(Partie*) initMyView*) window;
-(void) recoitclic;
-(void) dealloc;
@end
#import "Partie.h"
#import "MyView.h"
@implementation Partie
-(Partie*) initMyView*) window {
dessin = window;
//[MyView init];
return self;
}
-(void) recoitclic {
NSLog(@"clic\n");
}
-(void) dealloc {
NSLog(@"dealoc\n");
[super dealloc];
}
@end
ca c'est la classe 'a' :
@class Partie;
@interface MyView : NSOpenGLView {
Partie* master;
}
- (MyView*) init;
- (void) setMasterPartie*) parti;
- (void) drawRect: (NSRect) bounds;
- (void) mouseUpNSEvent *)theEvent;
@end
#import "MyView.h"
#include <OpenGL/gl.h>
#import "Partie.h"
@implementation MyView
-(void) setMasterPartie*) parti {
master = parti;
[master recoitclic];
}
- (MyView*) init{
return self;
}
-(void) drawRect: (NSRect) bounds {
}
-(void)mouseUpNSEvent *)theEvent {
NSLog(@"coucou\n");
[master recoitclic];
}
@end
et le controleur :
@class Partie, MyView;
@interface Controleur : NSObject {
IBOutlet NSButton* bouton_start;
IBOutlet MyView* window;
Partie* game;
}
-(IBAction)nouvellepartieid) sender;
@end
#import "Controleur.h"
#import "Partie.h"
#import "MyView.h"
@implementation Controleur
-(IBAction)nouvellepartieid) sender {
[bouton_start setHidden:YES];
window = [[MyView alloc] init];
game = [[Partie alloc] init:window];
[window setMaster:game];
[game retain]; // à mettre ? mis ou pas, ca ne marche pas
}
@end
tout est a chaque fois mis dans 2 fichiers .h et .m