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*) init
MyView*) window;
-(void) recoitclic;
-(void) dealloc;
@end
#import "Partie.h"
#import "MyView.h"
@implementation Partie
-(Partie*) init
MyView*) 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) setMaster
Partie*) parti;
- (void) drawRect: (NSRect) bounds;
- (void) mouseUp
NSEvent *)theEvent;
@end
#import "MyView.h"
#include <OpenGL/gl.h>
#import "Partie.h"
@implementation MyView
-(void) setMaster
Partie*) parti {
master = parti;
[master recoitclic];
}
- (MyView*) init{
return self;
}
-(void) drawRect: (NSRect) bounds {
}
-(void)mouseUp
NSEvent *)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)nouvellepartie
id) sender;
@end
#import "Controleur.h"
#import "Partie.h"
#import "MyView.h"
@implementation Controleur
-(IBAction)nouvellepartie
id) 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*) init
-(void) recoitclic;
-(void) dealloc;
@end
#import "Partie.h"
#import "MyView.h"
@implementation Partie
-(Partie*) init
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) setMaster
- (void) drawRect: (NSRect) bounds;
- (void) mouseUp
@end
#import "MyView.h"
#include <OpenGL/gl.h>
#import "Partie.h"
@implementation MyView
-(void) setMaster
master = parti;
[master recoitclic];
}
- (MyView*) init{
return self;
}
-(void) drawRect: (NSRect) bounds {
}
-(void)mouseUp
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)nouvellepartie
@end
#import "Controleur.h"
#import "Partie.h"
#import "MyView.h"
@implementation Controleur
-(IBAction)nouvellepartie
[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