Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[RubyCocoa] prob avec un "NSOpenPanel.openPanel"

7 réponses
Avatar
unbewusst.sein
truc bizarre, cette partie de mon code marchait très bien jusqu'à ce
matin, maintenant dès que le panel s'ouvre j'ai droit à gdb et l'appli
plante, même force quit ne la fait pas quittéer, pour quitter l'appli
lancée avec XCode, il faut que je quitte XCode...

la partie du code où ça déconne :


def addFolder( notification )
if !@root.nil?
oPanel = NSOpenPanel.openPanel
oPanel.setAllowsMultipleSelection( true )
oPanel.setCanChooseDirectories( true )
oPanel.setCanChooseFiles( false )
buttonClicked = oPanel.runModal

if buttonClicked == NSOKButton
files = oPanel.filenames
files.each { |f|
n = File.basename( f.to_s )
item = Folder.new( n, f.to_s, true, 1, @forbidenList )
@root.addItem( item )
@outlineView.reloadData
FileUtils.mkdir_p( "#{@root.path}/#{n}" )
}
end
@prefs.root = @root
@prefs.save
end
end


Nota bene : par différents "puts" je sais que ça déconne juste après la
ligne :

buttonClicked = oPanel.runModal


au départ j'ai cru à une incompatibilité (ou un bugg) de Default Folder
X, mais même désactivé, deloggage reloggage tjs ça coince...
--
La politique est l'art d'empécher les gens
de se méler de ce qui les regarde.
Paul Valéry

7 réponses

Avatar
luc
Une Bévue wrote:

truc bizarre, cette partie de mon code marchait très bien jusqu'à ce
matin, maintenant dès que le panel s'ouvre j'ai droit à gdb...


Et il dit quoi gdb ?

if !@root.nil?


Perso, les "if !" je les remplace par "unless" qui est plus joli
sémantiquement parlant :)

Ce qui donnerait donc:

unless @root.nil?

if buttonClicked == NSOKButton
files = oPanel.filenames
files.each { |f|
n = File.basename( f.to_s )
item = Folder.new( n, f.to_s, true, 1, @forbidenList )
@root.addItem( item )
@outlineView.reloadData
FileUtils.mkdir_p( "#{@root.path}/#{n}" )
}
end


- La variable files ne sert pas à grand chose.
- Les conventions Ruby veulent qu'en général un block sur plusieurs
lignes utilise do...end, et que seuls les blocks sur une ligne utilisent
{...}.
- Pourquoi les to_s ?
- Y a 2 'd' à forbidden.
- Le mkdir_p à chaque tour n'est pas très efficace.

Ce qui donnerait donc:

if buttonClicked == NSOKButton
Dir.mkdir(@root.path)
oPanel.filenames.each do |f|
n = File.basename(f)
item = Folder.new(n, f, true, 1, @forbiddenList)
@root.addItem(item)
@outlineView.reloadData
Dir.mkdir("#{@root.path}/#{n}")
end
end

Ok, ça ne résoud pas le problème de base :)

--
Luc Heinrich

Avatar
unbewusst.sein
Luc Heinrich wrote:

Perso, les "if !" je les remplace par "unless" qui est plus joli
sémantiquement parlant :)


c vrai c + joli...


Ce qui donnerait donc:

unless @root.nil?

if buttonClicked == NSOKButton
files = oPanel.filenames
files.each { |f|
n = File.basename( f.to_s )
item = Folder.new( n, f.to_s, true, 1, @forbidenList )
@root.addItem( item )
@outlineView.reloadData
FileUtils.mkdir_p( "#{@root.path}/#{n}" )
}
end


- La variable files ne sert pas à grand chose.


OK

- Les conventions Ruby veulent qu'en général un block sur plusieurs
lignes utilise do...end, et que seuls les blocks sur une ligne utilisent
{...}.


Ah.

- Pourquoi les to_s ?


passeke je range ces pathes dans un fichier de pref yaml qui n'aime pas
les objets NSqqc...

- Y a 2 'd' à forbidden.


bon, prudence je dois changer le nom d'un outlet...

- Le mkdir_p à chaque tour n'est pas très efficace.


euh c'est pas à chaque tour, c'est pour chaque dossier source choisi, le
mkdir fabrique le dossier destination.

par exemple, le type choisi :

/Users/yt/Desktop -o-> /Volumes/EMTEC KEY/Desktop
/Usres/yt/Documents -o-> /Volumes/EMTEC KEY/Documents

und so weiter...


Ce qui donnerait donc:

if buttonClicked == NSOKButton
Dir.mkdir(@root.path)
oPanel.filenames.each do |f|
n = File.basename(f)
item = Folder.new(n, f, true, 1, @forbiddenList)
@root.addItem(item)
@outlineView.reloadData
Dir.mkdir("#{@root.path}/#{n}")
end
end


Mouais...

Ok, ça ne résoud pas le problème de base :)


en effet, c'est arrivé quand j'étais en train de traquer mon pb d'espace
avec shell...

mais, ça n'a aucun rapport...

du coup, je ne peux + rien tester car je n'ai + de dossier à
synchroniser :[

côté gdb, ça se situe qq lignes après un "NSPopAutoreleasePool+364" :

0x90adf818 <+0296> beq- cr7,0x90adf85c <NSPopAutoreleasePool+364>
0x90adf81c <+0300> lwz r2,76(r1)
0x90adf820 <+0304> lwz r0,8(r2) <<<=== c'est là
0x90adf824 <+0308> cmpwi cr7,r0,0
0x90adf828 <+0312> bne- cr7,0x90adf85c <NSPopAutoreleasePool+364>


d'après ce que je comprends de gdb et de ce que j'y lis; le pb ne se
situe pas côté ruby mais cocoa
--
La politique est l'art d'empécher les gens
de se méler de ce qui les regarde.
Paul Valéry


Avatar
luc
Une Bévue wrote:

- Pourquoi les to_s ?


passeke je range ces pathes dans un fichier de pref yaml qui n'aime pas
les objets NSqqc...


Effectivement, to_s obligatoire donc.


- Le mkdir_p à chaque tour n'est pas très efficace.


euh c'est pas à chaque tour, c'est pour chaque dossier source choisi


Pour chaque dossier choisi, donc à chaque tour du each :) Quoi ? Je
pinaille moi ?

côté gdb, ça se situe qq lignes après un "NSPopAutoreleasePool+364" :


Ce genre de problème est quasi systématiquement du à un
NSAutoreleasePool qui est détruit et qui contient un NSObject quelconque
déjà détruit par ailleurs. Un double release sur un objet qui a son
compteur de référence à 1, donc. Il manque un retain qqpart ?

--
Luc Heinrich


Avatar
unbewusst.sein
Luc Heinrich wrote:


Effectivement, to_s obligatoire donc.


- Le mkdir_p à chaque tour n'est pas très efficace.


euh c'est pas à chaque tour, c'est pour chaque dossier source choisi


Pour chaque dossier choisi, donc à chaque tour du each :) Quoi ? Je
pinaille moi ?


non, jamais )))


côté gdb, ça se situe qq lignes après un "NSPopAutoreleasePool+364" :


Ce genre de problème est quasi systématiquement du à un
NSAutoreleasePool qui est détruit et qui contient un NSObject quelconque
déjà détruit par ailleurs. Un double release sur un objet qui a son
compteur de référence à 1, donc. Il manque un retain qqpart ?


je vois mais bon, je ne fais absolument rien dans ce goût là, pas une
ligne d'ObjC...

un bug RubyCocoa ?

je vais poster sur le groupe idoine...

ce qui est curieux est que c'est apparu tout d'un coup, quand je
corigeais mes pbs d'espaces...
--
La politique est l'art d'empécher les gens
de se méler de ce qui les regarde.
Paul Valéry



Avatar
unbewusst.sein
Luc Heinrich wrote:

euh c'est pas à chaque tour, c'est pour chaque dossier source choisi


Pour chaque dossier choisi, donc à chaque tour du each :) Quoi ? Je
pinaille moi ?


Ah oui, je vois ce que tu ferais, un collect sur les dirs et puis un
seul mkdir_p sur l'array des dirs collectés ???

+joli en effet.
--
La politique est l'art d'empécher les gens
de se méler de ce qui les regarde.
Paul Valéry


Avatar
luc
Une Bévue wrote:

je vois mais bon, je ne fais absolument rien dans ce goût là, pas une
ligne d'ObjC...


Euh, RubyCocoa n'est "rien d'autre" qu'un bridge Ruby <-> ObjC, et que
ce soit du Ruby ou de l'ObjC, Cocoa, le framework, reste le même.

--
Luc Heinrich

Avatar
unbewusst.sein
Luc Heinrich wrote:

je vois mais bon, je ne fais absolument rien dans ce goût là, pas une
ligne d'ObjC...


Euh, RubyCocoa n'est "rien d'autre" qu'un bridge Ruby <-> ObjC, et que
ce soit du Ruby ou de l'ObjC, Cocoa, le framework, reste le même.


oui, je suis d'accord, m'enfin, je ne fais rien de spécial, "ça a eu
marché"...

inquiétant...

d'ailleurs j'ai changé la ligne :

buttonClicked = oPanel.runModal

pour :

buttonClicked = oPanel.runModalForDirectory_file_types( DESKTOP, nil,
nil )

et là j'ai eu une palanquée de :

2007-09-13 12:44:07.744 eSync[18140] *** _NSAutoreleaseNoPool(): Object
0x163e6d0 of class NSCFArray autoreleased with no pool in place - just
leaking


ah zut pas cette fois-ci :

0x90adf818 <+0296> beq- cr7,0x90adf85c <NSPopAutoreleasePool+364>
0x90adf81c <+0300> lwz r2,76(r1)
0x90adf820 <+0304> lwz r0,8(r2) <<<=== prob
0x90adf824 <+0308> cmpwi cr7,r0,0
0x90adf828 <+0312> bne- cr7,0x90adf85c <NSPopAutoreleasePool+364>


d'ailleurs, maintenant j'ai ce genre de pb sur un autre file chooser...

--
La politique est l'art d'empécher les gens
de se méler de ce qui les regarde.
Paul Valéry