Tuto de Philippe Robinet outline data source

cyranocyrano Membre
novembre 2010 modifié dans API AppKit #1
bonsoir,

2/3 petites questions:

a) Xcode et IB en 3.2.2

comment fixer un menu a un pop up button cell. ca doit etre tout con  :( , mais l'Outlet est deja connecté a un "menu indecrottable"

b)

<br />			[node setValue:aParent forKey:@&quot;parent&quot;];<br />			//setValue fait un retain sur aParent dont on ne veux pas<br />			[aParent release];<br />


setValue sur un objet fait un [old release] [new retain] ok
mais pourquoi se debarrasser?

on evite de deallouer un Node qui a des enfants, non?

on devrait faire un [aParent release dans le dealloc] ?

c) ca va suivre.... :)

Réponses

  • cyranocyrano Membre
    15:36 modifié #2
    bon pour le point a j'ai trouvé  :)

    il suffit de modifier le menu proposé.

  • cyranocyrano Membre
    15:36 modifié #3
    bonsoir:

    soit
    <br /><br />+(NSIndexSet *) lastIndexes:(NSArray*) indexPaths<br />{<br />&nbsp; NSMutableIndexSet* indexSet=[NSMutableIndexSet indexSet];<br />&nbsp; for(id indexPath in indexPaths){<br />	if( ! [indexPath isKindOfClass:[NSIndexPath class]] ) continue;<br />	NSUInteger index=[indexPath lastIndex]; <br />	if(index!=NSNotFound) [indexSet addIndex:index];<br />&nbsp; }<br />&nbsp; return [indexSet copy];	 <br />}<br /><br /><br />
    


    utilisé:

    <br />-(void) insertNodes:(NSArray*) nodes atIndexPaths:(NSArray *) indexPaths<br />{<br />	// Localizing<br />	NSIndexPath * parentIndexPath=[[indexPaths lastObject] indexPathByRemovingLastIndex] ;<br />	BrowserTreeNode * parent=[self nodeAtIndexPath:parentIndexPath];	<br />	NSIndexSet * lastIndexes=[NSIndexPath lastIndexes:indexPaths];<br /><br />	//Changing<br />	[[undoManager prepareWithInvocationTarget:self] removeNodes:nodes atIndexPaths:indexPaths];	<br />	[[parent mutableChildNodes] insertObjects:nodes atIndexes:lastIndexes];<br /><br />	//update UI<br />	[browser updateUIAtIndexPath:parentIndexPath];	<br />}<br /><br />
    


    ici il manque [lastIndexes release];

    et
    <br /><br />+(BrowserTreeNode *) newEmptyNode<br />{<br />	NodeInfo * nodeInfo=[[[NodeInfo alloc] init] autorelease];<br />	BrowserTreeNode * node=[BrowserTreeNode treeNodeWithRepresentedObject:nodeInfo];<br />	return node;<br />}<br /><br />
    


    il manque [nodeInfo release];

    est ce exacte ? [je debute] par la même occasion lastIndex devrait etre createLastIndex ?
  • zoczoc Membre
    novembre 2010 modifié #4
    dans 1289758012:

    bonsoir:

    soit
    <br /><br />+(NSIndexSet *) lastIndexes:(NSArray*) indexPaths<br />{<br />&nbsp; NSMutableIndexSet* indexSet=[NSMutableIndexSet indexSet];<br />&nbsp; for(id indexPath in indexPaths){<br />&nbsp;  if( ! [indexPath isKindOfClass:[NSIndexPath class]] ) continue;<br />&nbsp;  NSUInteger index=[indexPath lastIndex]; <br />&nbsp;  if(index!=NSNotFound) [indexSet addIndex:index];<br />&nbsp; }<br />&nbsp; return [indexSet copy];&nbsp; &nbsp; <br />}<br />
    

    Le nom de cette méthode ne commence pas par init, copy ou new, et par conséquent devrait retourner un objet autoreleasé... donc return [[indexSet copy] autorelease]

    Accessoirement, pourquoi retourner une copie de indexSet ? retourner directement cet objet ne convient pas ? Si oui, alors "return indexSet" suffit (car la méthode indexSet de NSMutableIndexSet, comme son nom l'indique, retourne un objet autoreleasé).


    <br />-(void) insertNodes:(NSArray*) nodes atIndexPaths:(NSArray *) indexPaths<br />{<br />&nbsp;  // Localizing<br />&nbsp;  NSIndexPath * parentIndexPath=[[indexPaths lastObject] indexPathByRemovingLastIndex] ;<br />&nbsp;  BrowserTreeNode * parent=[self nodeAtIndexPath:parentIndexPath];&nbsp;  <br />&nbsp;  NSIndexSet * lastIndexes=[NSIndexPath lastIndexes:indexPaths];<br /><br />&nbsp;  //Changing<br />&nbsp;  [[undoManager prepareWithInvocationTarget:self] removeNodes:nodes atIndexPaths:indexPaths];&nbsp;  <br />&nbsp;  [[parent mutableChildNodes] insertObjects:nodes atIndexes:lastIndexes];<br /><br />&nbsp;  //update UI<br />&nbsp;  [browser updateUIAtIndexPath:parentIndexPath];&nbsp;  <br />}<br /><br />
    


    ici il manque [lastIndexes release];

    Non, pas si lastIndexes est implémenté correctement. Dans ton exemple, oui.


    <br /><br />+(BrowserTreeNode *) newEmptyNode<br />{<br />&nbsp;  NodeInfo * nodeInfo=[[[NodeInfo alloc] init] autorelease];<br />&nbsp;  BrowserTreeNode * node=[BrowserTreeNode treeNodeWithRepresentedObject:nodeInfo];<br />&nbsp;  return node;<br />}<br /><br />
    


    il manque [nodeInfo release];

    Non, nodeInfo reçoit un message autorelease. Par conséquent il recevra automatiquement un message release à  la fin de l'itération courante de la boucle de messages.


  • cyranocyrano Membre
    novembre 2010 modifié #5
    dans 1289760604:

    dans 1289758012:



    <br /><br />+(BrowserTreeNode *) newEmptyNode<br />{<br />&nbsp;  NodeInfo * nodeInfo=[[[NodeInfo alloc] init] autorelease];<br />&nbsp;  BrowserTreeNode * node=[BrowserTreeNode treeNodeWithRepresentedObject:nodeInfo];<br />&nbsp;  return node;<br />}<br /><br />
    


    il manque [nodeInfo release];

    Non, nodeInfo reçoit un message autorelease. Par conséquent il recevra automatiquement un message release à  la fin de l'itération courante de la boucle de messages.






    oops,  >:) j'ai oublié la moitié de la question, voici l'utilisation de newEmptyNode

    <br />-(IBAction) addChild:(id)sender<br />{<br />	// localizing<br />	NSBrowserCell * selectedCell=[browser selectedCell];<br />	if(nil==selectedCell) return;<br />	BrowserTreeNode * parent=[selectedCell representedObject];<br />	<br />	// adding <br />	BrowserTreeNode * node=[BrowserTreeNode newEmptyNode];<br />	NSIndexPath * indexPath=[[parent indexPath] indexPathByAddingIndex:[[parent childNodes] count]];<br />	[self insertNode:node atIndexPath:indexPath];<br />}<br />
    


    c'etait [node release] que je voulais ecrire

    la il y a une fuite
  • cyranocyrano Membre
    15:36 modifié #6
    je me suis fait "avoir" par le nom de la methode

    newEmptyNode (new donc un objet "retain")

    mais qui retourne un objet autorelease (methode tree...)

    sorry

    Voila que je ne sais plus écrire objet, je mets systematiquement un 'c' maintenant  :D

Connectez-vous ou Inscrivez-vous pour répondre.