Gestion de la mémoire, implémentation de constructeurs et mixer ses sources ...

2»

Réponses

  • MulotMulot Membre
    22:54 modifié #32
    Et ben, vivement le mois d'Octobre !

    Par contre, pour ce qui est des applis 32/64 bits, va falloir un proco 64 bits pour développer une appli 64 bits ? ou il y aura un moyen pour les faire tourner en 32 bits, vu que Leopard gère le 32 aussi bien que le 64, ça paraà®trait logique, non ?
  • schlumschlum Membre
    22:54 modifié #33
    Apple arrive bien à  faire des exécutables Intel avec Xcode sur un PPC et inversement  :P
    Je ne pense pas qu'il y ait des contraintes de processeurs pour quoi que ce soit...
  • MulotMulot Membre
    22:54 modifié #34
    Bon, je viens de finir de refaire mes 3 classes, qui seront pour l'instant la base d'une première version de ma version GUI. Je les balance ici, dans la seule intention que vous me fassiez part (si vous le voulez bien, bien entendu), de vos remarques, critiques ou commentaires qui seront les bienvenus. J'aimerai bien partir tranquillement sur ma GUI et ne pas m'apercevoir que pas mal de choses que j'ai faites avant sont bancales, pour me consacrer pleinement à  Cocoa.

    Merci bien !

    Les 3 classes, Operation, Account et AccountOwner :

    <br />//<br />//&nbsp; Operation.h<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 16/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface Operation : NSObject {<br /><br />@private <br /><br />	//designation of the opeartion<br />	NSString * operationDesignation;<br />	<br />	//The amount of the operation<br />	double operationAmount;<br />	<br />	//The date of the opeartion<br />	NSDate * operationDate;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSDate * operationValueDate;<br />	<br />	//Boolean values for revenue or expense operations<br />	BOOL revenue;<br />	BOOL expense;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //The type of operation blue card, check or other<br />&nbsp; &nbsp; NSString * operationType ;<br /><br />}<br /><br />- (id) initWithDesignation: (NSString*) des andAmount: (double) amount andOperationType: (NSString*) optype andDate: (NSDate*) date ;<br /><br />- (NSString*) operationType ;<br /><br />- (NSDate*) operationDate ;<br /><br />- (NSDate*) operationValueDate ;<br /><br />- (NSString*) operationDesignation ;<br /><br />- (double) operationAmount ;<br /><br />- (BOOL) revenue ;<br /><br />- (BOOL) expense ;<br /><br />- (void) setOperationDate: (NSDate*) valDate ;<br /><br />- (void) setOperationValueDate: (NSDate*) valDate ;<br /><br />- (void) setOperationType: (NSString*) newOperationType ;<br /><br />- (void) setRevenueTrue ;<br /><br />- (void) setExpenseTrue ;<br /><br />- (void) setOperationDesignation: (NSString*) newDesignation ;<br /><br /><br /><br />- (NSString*) description ;<br /><br /><br />@end<br />
    



    //<br />//&nbsp; Operation.m<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 16/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &quot;Operation.h&quot;<br /><br /><br />@implementation Operation<br /><br />- (id) initWithDesignation: (NSString*) des andAmount: (double) amount andOperationType: (NSString*) typeop andDate: (NSDate*) date {<br /><br /><br />if(self = [super init]){<br /><br />	operationDesignation = [des retain];<br />	operationAmount = amount;<br />	operationDate = [date retain];<br />&nbsp; &nbsp; operationType = [typeop retain];<br />	revenue = FALSE;<br />	expense = FALSE;<br />&nbsp; &nbsp; //penser a release date lors du set nouvelle valueDate<br />&nbsp; &nbsp; operationValueDate = [date retain];<br />	return self;	<br />&nbsp; &nbsp; }<br /><br />return nil;<br /><br />}<br /><br /><br />- (NSString*) operationDesignation {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return operationDesignation;<br />}<br /><br /><br />- (NSString*) operationType {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return operationType;<br />}<br /><br />- (double) operationAmount {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return operationAmount;<br />}<br /><br />- (BOOL) operationRevenue {<br />	<br />	return revenue;<br />}<br /><br />- (NSDate*) operationDate {<br />	<br />	return operationDate;<br />}<br /><br />- (NSDate*) operationValueDate {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return operationValueDate;<br />}<br /><br />- (BOOL) expense {<br />	<br />	return expense;<br />}<br /><br />- (BOOL) revenue {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return revenue;<br />}<br /><br />- (void) setOperationValueDate: (NSDate*) valdate {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [valdate retain];<br />&nbsp; &nbsp; [operationValueDate release];<br />&nbsp; &nbsp; //release etant donne que ce n est plus la meme&nbsp; date par defaut<br />&nbsp; &nbsp; if([operationDate retainCount] != 1){<br />&nbsp; &nbsp; &nbsp; &nbsp; [operationDate release];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; operationValueDate = valdate;<br />}<br /><br />- (void) setOperationDate: (NSDate*) newOperationDate {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [newOperationDate retain];<br />&nbsp; &nbsp; [operationDate release];<br />&nbsp; &nbsp; operationDate = newOperationDate;<br />}<br /><br />- (void) setOperationDesignation: (NSString*) newOperationDesignation {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [newOperationDesignation retain];<br />&nbsp; &nbsp; [operationDesignation release];<br />&nbsp; &nbsp; operationDesignation = newOperationDesignation;<br />}<br /><br />- (void) setRevenueTrue {<br /><br />	revenue = TRUE;<br />	expense = FALSE;<br />}<br /><br />- (void) setExpenseTrue {<br /><br />	revenue = FALSE;<br />	expense = TRUE;<br />}<br /><br />- (void) setOperationType: (NSString*) newOperationType {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [newOperationType retain];<br />&nbsp; &nbsp; [operationType release];<br />&nbsp; &nbsp; operationType = newOperationType;<br />}<br /><br /><br />- (NSString*) description {<br />	<br />		<br />	NSString * debcred;<br />	<br />	if( [self revenue]){<br />	&nbsp; &nbsp;  debcred = @&quot; Revenue&quot;;<br />&nbsp; &nbsp; }else{ if([self expense]){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debcred = @&quot;Expense&quot;;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; NSString * deb = [NSString stringWithFormat: @&quot;&#092;n&#092;nOperation: %@ &#092;nValue: %.2f&#092;nDate of the operation: %@&#092;nValue Date: %@&#092;nType of Operation: %@&#092;n&quot;, operationDesignation, operationAmount, [operationDate description],[operationValueDate description],debcred];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return deb;<br />	<br />}<br /><br />- (void) dealloc {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [operationDesignation release];<br />&nbsp; &nbsp; [operationDate release];<br />&nbsp; &nbsp; [operationValueDate release];<br />&nbsp; &nbsp; [operationType release];&nbsp; &nbsp; <br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br />@end<br />
    



    //<br />//&nbsp; Account.h<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 15/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br />#import &lt;Foundation/Foundation.h&gt;<br />#import &quot;Operation.h&quot;<br /><br />@class AccountOwner;<br /><br /><br />@interface Account : NSObject {<br /><br />@private<br /><br />	//The operation arary<br />	NSMutableArray * operationTab;<br />	<br />	//The number of current operation in the array<br />	int numberOfOperation;<br />	<br />	//The name of the account<br />	NSString *accountName;<br />	<br />&nbsp; &nbsp; //The owner of the account<br />	AccountOwner * owner;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; BOOL accountOwned;<br />	<br />	//The account bank&#39;s name<br />	NSString *bankName;<br />	<br />	//The current sum of the account<br />	double currentAccountSum;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //The amount to be add or sub for valueDates<br />&nbsp; &nbsp; double amountToBeAdded ;<br />	<br />	<br />	<br />}<br /><br />//test if the value date is older than the current date<br />+ (BOOL) addWaitingOperation:(Operation*) operation ;<br /><br /><br />- (id) initWithBankName: (NSString*) bname andAccountOwner: (AccountOwner*) owner andAccountName: (NSString*) account_name;<br /><br />- (void) addOperation: (Operation*) op ;<br /><br />- (BOOL) isOwned ;<br /><br />- (double) amountToBeAdded ;<br /><br />- (AccountOwner*) accountOwner ;<br /><br />- (int) numberOfOperation ;<br /><br />- (double) currentAccountSum ;<br />&nbsp; &nbsp; <br />- (Operation*) operationAtIndex: (int) ind ;<br /><br />- (void) deleteOperationAtIndex: (int) ind ;<br /><br />- (void) setOwned: (BOOL) boolean ;<br /><br />- (void) setAccountOwner: (AccountOwner*) newAccountOwner ;<br /><br />- (void) setAccountName : (NSString*) newAccountName ;<br /><br />- (void) sortByOperationDateAsc ;<br /><br />- (void) sortByOperationDateDesc ;<br /><br />- (void) sortByOperationValueAsc ;<br /><br />- (void) sortByOperationValueDesc ;<br /><br />- (void) sortByOperationNameAsc ;<br /><br />- (void) sortByOperationNameDesc ;<br /><br />- (void) sortByExpense ;<br /><br />- (void) sortByRevenue ;<br /><br />- (NSString*) description ;<br /><br /><br />@end<br />
    


    et son implémentation

    <br />//<br />//&nbsp; Account.m<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 15/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &quot;Account.h&quot;<br />@class AccountOwner;<br /><br />int intSortExpense(id num1, id num2, void *context)<br />{<br />&nbsp; &nbsp; BOOL v1 = [num1 expense];<br />&nbsp; &nbsp; BOOL v2 = [num2 expense];<br />&nbsp; &nbsp; if (v1 == TRUE &amp;&amp; v2 == FALSE)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedAscending;<br />&nbsp; &nbsp; else if (v2 == TRUE &amp;&amp; v1 == FALSE)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedDescending;<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedSame;<br />}<br /><br />int intSortRevenue(id num1, id num2, void *context)<br />{<br />&nbsp; &nbsp; BOOL v1 = [num1 revenue];<br />&nbsp; &nbsp; BOOL v2 = [num2 revenue];<br />&nbsp; &nbsp; if (v1 == TRUE &amp;&amp; v2 == FALSE)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedAscending;<br />&nbsp; &nbsp; else if (v2 == TRUE &amp;&amp; v1 == FALSE)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedDescending;<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedSame;<br />}<br /><br />@implementation Account<br /><br /><br />- (id) initWithBankName: (NSString*) bname andAccountOwner: (AccountOwner*) own andAccountName:(NSString*) paccountname {<br /><br />if(self = [super init]){<br />	<br />	operationTab = [[NSMutableArray alloc] init];<br />	numberOfOperation = 0;<br />	accountName = [paccountname retain];<br />	owner = [own retain];<br />	bankName = [bname retain];<br />	currentAccountSum = 0.0;<br />&nbsp; &nbsp; amountToBeAdded = 0.0;<br />&nbsp; &nbsp; accountOwned = YES;<br />	return self;<br />	}<br />	<br />return nil;<br />}<br /><br />+ (BOOL) addWaitingOperation:(Operation*) operation {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; BOOL result = NO;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSDate * actualDate = [NSDate date];<br />&nbsp; &nbsp; NSDate * operationDate = [operation operationValueDate];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if(actualDate == [operationDate laterDate: actualDate]){<br />&nbsp; &nbsp; &nbsp; &nbsp; result = YES;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return result;<br />}<br /><br />- (void) addOperation: (Operation*) op {&nbsp; &nbsp; <br /><br />	[operationTab insertObject: op atIndex : numberOfOperation];<br />	numberOfOperation++;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //if the operation is up to be added<br />&nbsp; &nbsp; if([Account addWaitingOperation:op]){<br />&nbsp; &nbsp; &nbsp; &nbsp; if([op expense]){ <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentAccountSum -= [op operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentAccountSum += [op operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; if([op expense]){ <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amountToBeAdded -= [op operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amountToBeAdded += [op operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }&nbsp; &nbsp; <br />&nbsp; &nbsp; //Use a selector in order to sort account with the user choosen sorting type<br />&nbsp; &nbsp; [self sortByOperationDateAsc];<br />&nbsp; &nbsp; <br />}<br /><br />- (double) amountToBeAdded {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return amountToBeAdded;<br />}<br /><br />- (void) deleteOperationAtIndex: (int) ind {&nbsp; &nbsp; <br />	<br />&nbsp; &nbsp; //allow only deleteOperation to an none null object<br />	if(numberOfOperation &gt;= 0 &amp;&amp; ind &lt; [operationTab count]){<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />		numberOfOperation--;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; Operation * operationToDelete = [operationTab objectAtIndex:ind];<br />&nbsp; &nbsp; &nbsp; &nbsp; BOOL expense = [operationToDelete expense];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if([Account addWaitingOperation: operationToDelete]){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(expense){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentAccountSum += [operationToDelete operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentAccountSum -= [operationToDelete operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(expense){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amountToBeAdded += [operationToDelete operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amountToBeAdded -= [operationToDelete operationAmount];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />		[operationTab removeObjectAtIndex:ind];<br />	}<br />}<br /><br />- (AccountOwner*) accountOwner {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return owner;<br />}<br /><br />- (void) setAccountOwner: (AccountOwner*) ao {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [ao retainCount];<br />&nbsp; &nbsp; [owner release];<br />&nbsp; &nbsp; owner = ao;<br />}<br /><br />- (BOOL) isOwned {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return accountOwned;&nbsp;  <br />}<br /><br />- (int) numberOfOperation {<br />	<br />	return numberOfOperation;<br />}<br /><br />- (double) currentAccountSum {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return currentAccountSum;<br />}<br /><br /><br />- (Operation*) operationAtIndex: (int) ind {&nbsp; <br />		<br />	return [operationTab objectAtIndex:ind];<br />}<br /><br />- (void) setOwned: (BOOL) boolean {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; accountOwned = boolean;<br />}<br /><br />- (void) sortByOperationValueAsc {&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationAmount&quot;ascending:YES] autorelease];<br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />}<br /><br />- (void) sortByOperationValueDesc {&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationAmount&quot;ascending:NO] autorelease];<br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />}<br /><br />- (void) sortByOperationDateAsc {&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationDate&quot;ascending:YES] autorelease];<br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />}<br /><br />- (void) sortByOperationDateDesc {&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationDate&quot;ascending:NO] autorelease];<br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />}<br /><br />- (void) sortByOperationNameAsc {&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationDesignation&quot;ascending:YES] autorelease];<br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />&nbsp; &nbsp; <br />}<br /><br />- (void) sortByOperationNameDesc {&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSSortDescriptor * lastNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@&quot;operationDesignation&quot;ascending:NO] autorelease];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; NSArray * sortDescriptors = [NSArray arrayWithObject:lastNameDescriptor];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />&nbsp; &nbsp; <br />}<br /><br />- (void) sortByExpense {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingFunction:intSortExpense context:NULL];<br /><br />}<br /><br />- (void) sortByRevenue{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; operationTab = [operationTab sortedArrayUsingFunction:intSortRevenue context:NULL];<br /><br />}<br /><br />- (NSString*) description {<br />	<br />	id operation;<br />	<br />	NSEnumerator * enumerator = [operationTab objectEnumerator];<br /><br />	NSString * begining = [NSString stringWithFormat:@&quot;Acount description : &#092;nBank: %@&#092;nName: %@ &#092;nAmount: %.2f &#092;nAmount waiting: %.2f&#092;n&#092;n&quot;,bankName,accountName,[self currentAccountSum],amountToBeAdded];<br /><br />	while(operation = [enumerator nextObject]){<br />		begining = [begining stringByAppendingString:@&quot;&#092;n&quot;];<br />		begining = [begining stringByAppendingString:[operation description]];<br />	}<br />	return begining;<br />	<br />}<br /><br />@end<br />
    



    Et la dernière (si y'a des masos pour la regarder !)

    //<br />//&nbsp; AccountOwner.h<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 15/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br />@class Account;<br /><br />@interface AccountOwner : NSObject {<br /><br />@private<br />	//First and last name of the owner, adress<br />	NSString *lastName,*firstName,*adress;<br /><br />	//Owner birthday<br />	NSDate *birthday;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //Account owned by the user<br />&nbsp; &nbsp; NSMutableArray * accountTab;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // number of account in the array<br />&nbsp; &nbsp; int numberOfAccount ;<br />}<br /><br /><br />- (id) initWithFirstName: (NSString*) pfirstname andLastName: (NSString*) plastname andBirthday: (NSDate*) date ;<br /><br />- (void) addAccount: (Account*) anAccount ;<br /><br />- (Account*) accountAtIndex: (int) index ;<br /><br />- (void) removeAccountAtIndex: (int) index ;<br /><br />- (void) setFirstName: (NSString*) name ;<br /><br />- (void) setLastName: (NSString*) lname ;<br /><br />- (void) setBirthDay: (NSDate*) bd ;<br /><br />- (void) setAdress: (NSString*) ad ;<br /><br />- (NSString*) firstName ;<br /><br />- (NSString*) lastName ;<br /><br />- (NSString*) adress ;<br /><br />- (NSDate*) birthday ;<br /><br />- (NSString*) description ;<br /><br /><br />@end<br />
    



    <br />//<br />//&nbsp; AccountOwner.m<br />//&nbsp; MoneyOrganizer_0.1<br />//<br />//&nbsp; Created by Mulot on 15/06/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &quot;AccountOwner.h&quot;<br /><br /><br />@implementation AccountOwner<br /> <br /><br />- (id) initWithFirstName: (NSString*) pFirstName andLastName: (NSString*) pLastName andBirthday: (NSDate*) date{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if(self = [super init]){<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; firstName = [pFirstName retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; lastName = [pLastName retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; birthday = [date retain];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; accountTab = [[NSMutableArray alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; numberOfAccount = 0;<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; return self;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return nil;<br />}	<br /><br />- (void) addAccount: (Account*) anAccount {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if( anAccount != nil){<br />&nbsp; &nbsp; &nbsp; &nbsp; [accountTab insertObject:anAccount atIndex:numberOfAccount];<br />&nbsp; &nbsp; &nbsp; &nbsp; numberOfAccount++;<br />&nbsp; &nbsp; }<br />}<br /><br />- (Account*) accountAtIndex: (int) index {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return [accountTab objectAtIndex:index];<br />&nbsp; &nbsp; <br /><br />}<br /><br />- (void) removeAccountAtIndex: (int) index {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if( index &gt;= 0 &amp;&amp; index &lt; [accountTab count]){<br />&nbsp; &nbsp; &nbsp; &nbsp; [accountTab removeObjectAtIndex:index];<br />&nbsp; &nbsp; }<br />}<br /><br />- (void) setFirstName: (NSString*) name {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [name retain];<br />&nbsp; &nbsp; [firstName release];<br />&nbsp; &nbsp; firstName = name;<br />	<br />}	<br /><br />- (void) setLastName: (NSString*) lname {<br /><br />&nbsp; &nbsp; [lname retain];<br />&nbsp; &nbsp; [lastName release];<br />&nbsp; &nbsp; lastName = lname;<br /><br />}<br /><br />- (void) setBirthDay: (NSDate*) bd {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [bd retain];<br />&nbsp; &nbsp; [birthday release];<br />&nbsp; &nbsp; birthday = bd;<br />	<br /><br />}<br /><br />- (void) setAdress: (NSString*) ad {<br /><br />&nbsp; &nbsp; [ad retain];<br />&nbsp; &nbsp; [adress release];<br />&nbsp; &nbsp; adress = ad;<br /><br />}<br /><br />- (NSString*) firstName {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return firstName;<br />}<br />&nbsp; &nbsp; <br />- (NSString*) lastName {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return lastName;<br />}<br /><br />- (NSString*) adress {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return adress;<br />}<br /><br />- (NSDate*) birthday {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return birthday;<br />}<br /><br /><br />- (NSString*) description {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSString * description = [NSString stringWithFormat:@&quot;&#092;nFirst Name: %@ &#092;nLast Name: %@ &#092;nAdress: %@ &#092;nBirthday: %@ &#092;n&quot;,firstName,lastName,adress,[birthday description]];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSEnumerator * enumerator = [accountTab objectEnumerator];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; id anAccount;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; while(anAccount = [enumerator nextObject]){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; description = [description stringByAppendingString:[anAccount description]];<br />&nbsp; &nbsp; &nbsp; &nbsp; description = [description stringByAppendingString:@&quot;&#092;n&quot;];<br /><br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; return description;&nbsp; &nbsp; <br />}<br /><br />- (void) dealloc {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [firstName release];<br />&nbsp; &nbsp; [lastName release];<br />&nbsp; &nbsp; [adress release];<br />&nbsp; &nbsp; [birthday release];<br />&nbsp; &nbsp; [accountTab release];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br /><br />@end<br />
    


  • schlumschlum Membre
    22:54 modifié #35
    - (void) setOperationValueDate: (NSDate*) valdate {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [valdate retain];<br />&nbsp; &nbsp; [operationValueDate release];<br />&nbsp; &nbsp; //release etant donne que ce n est plus la meme&nbsp; date par defaut<br />&nbsp; &nbsp; if([operationDate retainCount] != 1){<br />&nbsp; &nbsp; &nbsp; &nbsp; [operationDate release];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; operationValueDate = valdate;<br />}
    

    Grrr ! D'où ton setter se mêle de faire un release sur operationDate ? C'est incroyable ça !  :)
    En général, on a jamais besoin d'utiliser "retainCount" quand on code... Juste pour débuguer.
  • MulotMulot Membre
    22:54 modifié #36
    En fait, j'ai fait cette manip parce que dans le constructeur, je met là  date de valeur par defaut vers la date de l'operation. Donc la date possède à  ce moment là  un retainCount de 2.

    Ensuite si je souhaite la modifier, cette date de valeur, je retain la nouvelle, je release l'ancienne.

    En fait j'ai pensé à  plusieurs cas: 1 er cas, on utilise le setter juste après le constructeur, donc operationDate et operationValueDate pointent tout les deux sur le même objet, retain count de 2. Donc ce retain count doit devenir 1 si cet objet est différent de l'actuel.

    Autre cas, j'avais déjà  fait pointer operationValueDate sur un autre objet que celui pointé par operationDate, auquel cas ces deux dates sont retenues "normalement", d'où la présence de mon if.

    En gros la release sur operationDate ne se fait que lorsque c'est le "premier" setter sur mon objet.

    Je me trompe ?

    Merci Shclum pour ta patience !

    PS: Sous IE (désolé je suis pas chez moi là  :p), les quotes pour le code n'ont pas de scroll bar, d'où un bon scroll de la mort qui en découle !
  • schlumschlum Membre
    22:54 modifié #37
    dans 1183034962:

    En fait, j'ai fait cette manip parce que dans le constructeur, je met là  date de valeur par defaut vers la date de l'operation. Donc la date possède à  ce moment là  un retainCount de 2.


    Non, de 3 (au moins), car celui qui aura appelé le constructeur n'aura pas manqué de mettre un retain (temporaire) sur "date" ; tu en ajoutes 2...

    Ensuite si je souhaite la modifier, cette date de valeur, je retain la nouvelle, je release l'ancienne.


    Oui, c'est ce qu'il faut faire...

    En fait j'ai pensé à  plusieurs cas: 1 er cas, on utilise le setter juste après le constructeur, donc operationDate et operationValueDate pointent tout les deux sur le même objet, retain count de 2. Donc ce retain count doit devenir 1 si cet objet est différent de l'actuel.


    Ben là  avec ton truc il va devenir 0 :P (et crash en prévision dans le destructeur...)

    Autre cas, j'avais déjà  fait pointer operationValueDate sur un autre objet que celui pointé par operationDate, auquel cas ces deux dates sont retenues "normalement", d'où la présence de mon if.

    En gros la release sur operationDate ne se fait que lorsque c'est le "premier" setter sur mon objet.

    Je me trompe ?


    Oui... Il se fait complètement aléatoirement en fonction de la "vie" de l'objet date avant le constructeur et entre les appels...
  • MulotMulot Membre
    juin 2007 modifié #38
    dans 1183042750:

    Non, de 3 (au moins), car celui qui aura appelé le constructeur n'aura pas manqué de mettre un retain (temporaire) sur "date" ; tu en ajoutes 2...

    Oui... Il se fait complètement aléatoirement en fonction de la "vie" de l'objet date avant le constructeur et entre les appels...


    J'ai enlevé mon if, et laissé un setter "normal" pour cette méthode. En fait ce que j'ai fait n'était pas logique.

    Maintenant lorsque j'exécute ceci :

    <br />Operation * achatMBP = [[Operation alloc] initWithDesignation:@&quot;AchatMBP&quot; andAmount:1600.99 andOperationType:@&quot;Card&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; andDate:[NSDate dateWithString:@&quot;2006-08-18 12:00:00 +000&quot;]];<br /><br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;Valeur initiale retainCount pour Date : %d &#092;nPour Value Date %d &#092;n-----&quot;,[[achatMBP operationDate] retainCount],[[achatMBP operationValueDate] retainCount]);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSDate * valueDate = [NSDate dateWithString:@&quot;2008-07-20 12:00:00 +000&quot;];<br />&nbsp; &nbsp;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [achatMBP setOperationValueDate:valueDate];<br /><br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;Valeur modifiee retainCount pour Date : %d &#092;nPour Value Date %d &#092;n-----&quot;,[[achatMBP operationDate] retainCount],[[achatMBP operationValueDate] retainCount]);<br /><br />&nbsp; &nbsp;
    



    [Session started at 2007-06-28 18:25:49 +0200.]
    2007-06-28 18:25:49.899 MoneyOrganizer_v0.2[2484] Valeur initiale retainCount pour Date : 3
    Pour Value Date 3



    2007-06-28 18:25:49.899 MoneyOrganizer_v0.2[2484] Valeur modifiee retainCount pour Date : 2
    Pour Value Date 2



    MoneyOrganizer_v0.2 has exited with status 0.

    Ce qui est en théorie, et si je ne trompe point, normal :

    j'essaie de m'auto-persuader là , donc juste après l'initialisation de l'objet Operation, le retainCount de la date est de 3, 2 retains fait dans le constructeurs, ce qui ets attendu pour mettre valueDate par defaut identique à  la date de l'opération, et un retain fait lors de la saisie du string en paramètre du constructeur.

    Si je ne fais rien de plus, que ma méthode se termine et d'autres sont lancées, le string en param qui est dans l'autoreleasePool va donc être libéré, et ma date aura uen valeur de retain de 2, car nécessaire encore pour operationDate et operationValueDate. Là  ça va.

    Imaginons que la méthode se déroule comme suit après dans l'exemple, une modification de la value Date avec un nouveau String.

    Ce nouveau String à  un retainCount de 1, on appelle le setter, qui fait un retain immediatement dessus, la nouvelle valueDate passe à  2, on release l'ancienne (donc si c'est le premier setter de l'objet, la date normale passe a un retain count de 1 si on considère que l'on est plus dans le bloc de l'initialisation).

    Après l'exécution de cette méthode dans le même bloc que l'init, operationDate est à  2, et valueDate aussi, ce qui est conforme au résultat voulu non ? Puisque les deux objets Strings vont ensuite être release grâce à  la pool ?

    Est-ce alors un comportement normal et qui n'occasionne pas de perte de mémoire ?

    C'est pas comme si je me posais trop de question et que ça me faisait que m'embrouiller hein !

    Edit: En utilisant les NSSortDescriptors, je trie mon tableau et comme la méthode retourne un NSArray, je fais donc "naturellemen"

    <br /> operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />
    


    Comme dans l'exemple fournit dans l'API à  l'exception près que dans l'exemple, ce ne sont pas les mêmes tableaux. Dans mon cas, quand je compile et j'exécute, ça marche impec, pas de soucis, mais j'ai un warning à  la compilation "Assignement from distinct Objective-C type". Je comprend pourquoi puisque un NSArray est retourné, alors que mon tableau trié est un NSMutablearray, mais vu que c'est une sous classe, je comprend moins.

    De plus si j'écris juste
    <br />[operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />
    


    Cela fonctionne aussi et sans warning. Faut-il caster ou utiliser cette seconde solution ?

  • schlumschlum Membre
    juin 2007 modifié #39
    dans 1183048613:

    Ce qui est en théorie, et si je ne trompe point, normal :

    j'essaie de m'auto-persuader là , donc juste après l'initialisation de l'objet Operation, le retainCount de la date est de 3, 2 retains fait dans le constructeurs, ce qui ets attendu pour mettre valueDate par defaut identique à  la date de l'opération, et un retain fait lors de la saisie du string en paramètre du constructeur.

    Si je ne fais rien de plus, que ma méthode se termine et d'autres sont lancées, le string en param qui est dans l'autoreleasePool va donc être libéré, et ma date aura uen valeur de retain de 2, car nécessaire encore pour operationDate et operationValueDate. Là  ça va.


    Oui, les deux restants seront pour un libéré par l'auto-release pool et pour l'autre libéré par ton destructeur...

    Imaginons que la méthode se déroule comme suit après dans l'exemple, une modification de la value Date avec un nouveau String.

    Ce nouveau String à  un retainCount de 1, on appelle le setter, qui fait un retain immediatement dessus, la nouvelle valueDate passe à  2, on release l'ancienne (donc si c'est le premier setter de l'objet, la date normale passe a un retain count de 1 si on considère que l'on est plus dans le bloc de l'initialisation).

    Après l'exécution de cette méthode dans le même bloc que l'init, operationDate est à  2, et valueDate aussi, ce qui est conforme au résultat voulu non ? Puisque les deux objets Strings vont ensuite être release grâce à  la pool ?


    Euh date ? string ? Ne confonds pas tout, j'y comprends plus rien :P Mais à  priori c'est ça, sauf qu'il n'y en aura qu'un relâché par la pool et l'autre et aux soins de la classe, donc c'est le destructeur qui s'en occupera.

    Est-ce alors un comportement normal et qui n'occasionne pas de perte de mémoire ?

    C'est pas comme si je me posais trop de question et que ça me faisait que m'embrouiller hein !


    Faut pas trop se poser de question ; chaque objet gère sa mémoire de manière symétrique ; là  où il pose un retain, il envoie un release plus tard. Et s'il ne sait pas quand envoyer le release (après avoir donné l'objet retenu à  un autre objet par exemple), il le met dans l'AutoReleasePool et s'en lave les mains.

    Edit: En utilisant les NSSortDescriptors, je trie mon tableau et comme la méthode retourne un NSArray, je fais donc "naturellemen"

    <br /> operationTab = [operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />
    


    Comme dans l'exemple fournit dans l'API à  l'exception près que dans l'exemple, ce ne sont pas les mêmes tableaux. Dans mon cas, quand je compile et j'exécute, ça marche impec, pas de soucis, mais j'ai un warning à  la compilation "Assignement from distinct Objective-C type". Je comprend pourquoi puisque un NSArray est retourné, alors que mon tableau trié est un NSMutablearray, mais vu que c'est une sous classe, je comprend moins.

    De plus si j'écris juste
    <br />[operationTab sortedArrayUsingDescriptors:sortDescriptors];<br />
    


    Cela fonctionne aussi et sans warning. Faut-il caster ou utiliser cette seconde solution ?




    Si "operationTab" est mutable et que tu l'affectes avec le résultat d'une fonction qui renvoie du non mutable, il ne va pas être content, c'est sûr, d'où le warning...

    Il faut utiliser :
    - (void)sortUsingSelector:(SEL)comparator
    
    de NSMutableArray ; ça trie directement le tableau mutable et ça évite de créer un autre objet.

    Ta seconde solution me paraà®t très douteuse... Normalement ça ne change pas l'array.
  • MulotMulot Membre
    22:54 modifié #40
    Merci pour ta patience et ton avis Schlum ! (et les autres aussi !).

    pour trier le tableau, j'ai casté en MutableArray, et là , plus de warning, donc c'est réglé.

    Je vais pouvoir commencer ma GUI et ne me consacrer alors plus qu'a mes erreurs d'outlets et autre, en sachant que je pars sur une base saine.

    Sûrement à  bientôt sur d'autres topics !
  • schlumschlum Membre
    juin 2007 modifié #41
    dans 1183129408:

    pour trier le tableau, j'ai casté en MutableArray, et là , plus de warning, donc c'est réglé.


    Très mauvais idée... Ne jamais caster un mutable en non mutable et inversement... Tu vas droit au mur avec des crash et des leaks en prévision.

    Le compilateur est complaisant avec ce genre d'idées, puisque de toute façon, on peut caster n'importe quel objet en id et id en n'importe quel autre objet.

    Elles ne te plaisent pas les méthodes de NSMutableArray pour le tri ??
  • MulotMulot Membre
    22:54 modifié #42
    Ah ben oui, celle de mutable array, mais je pensais pouvoir juste utiliser celle de array dont elle héritait, mais en fait non, merci encore une fois, y'a des jours où faut que j'ouvre les n'oe“ils !
Connectez-vous ou Inscrivez-vous pour répondre.