Fördelar/nackdelar med alloc, init, release osv.

Tråden skapades och har fått 1 svar. Det senaste inlägget skrevs .
1

Jag har skrivit ett program men funderar kring användningen av alloc, init och release. Gör det någon skillnad i till exempel det här exemplet?

Jag har den här koden:

#import "QuoteController.h"

@implementation QuoteController

- (IBAction)SaySomething:(id)sender
{
	/* Create an array to contain the quotes */
	NSMutableArray *myArray = [NSMutableArray array];
	
	/* Fill the array with quotes */
	[myArray addObject:@"Me Fail English? That's Unpossible! - Ralp Wiggum"];       
	[myArray addObject:@"Kids, you tried your best and you failed miserably. The lesson is, never try. - Homer Simpson"]; 
	[myArray addObject:@"The doctor said I wouldn't have so many nose bleeds if I kept my finger outta there. - Ralp Wiggum"]; 

	/* Get a random index number */
	int index = (int)([myArray count]*drand48());

	/* Put the quote in a string */
	NSString *myQuote = [myArray objectAtIndex:index]; 
	NSString *myTitle = [NSString stringWithFormat:@"Quote number %d", index+1];
	
	/* Show the quote */
	NSRunAlertPanel(myTitle, myQuote, nil, nil, nil);
}

@end

Jag har den även omskriven till:

#import "QuoteController.h"
@implementation QuoteController
- (IBAction)SaySomething:(id)sender
{
	/* Create an array to contain the quotes */
	NSMutableArray *myArray = [NSMutableArray array];
		
	/* Fill the array with quotes */
	[myArray addObject:@"Me Fail English? That's Unpossible! - Ralp Wiggum"];       
	[myArray addObject:@"Kids, you tried your best and you failed miserably. The lesson is, never try. - Homer Simpson"]; 
	[myArray addObject:@"The doctor said I wouldn't have so many nose bleeds if I kept my finger outta there. - Ralp Wiggum"]; 

	/* Get a random index number */
	int index = (int)([myArray count]*drand48());

	/* Put the quote in a string */
	NSString *myQuote = [[NSString alloc] initWithString:[myArray objectAtIndex:index]]; 
	NSString *myTitle = [[NSString alloc] initWithString:[NSString stringWithFormat:@"Quote number %d", index+1]];
		
	/* Show the quote */
	NSRunAlertPanel(myTitle, myQuote, nil, nil, nil);

	[myQuote release];
	[myTitle release];
}

@end

Det första fallet är ju enligt min mening smidigare (lite mindre textmassa att skriva och överblicka). Nackdelen är ju att minnet som upptas av myQuote och myTitle inte släpps förrän nästa gång din autorelease-pool gås över, vilket i normala fall är nästa event loop.

Anropar du funktionen tusentals gånger i en event loop (vilket inte är troligt eftersom du visar en panel!) bör du undvika att använda autorelease för att inte förbruka för mycket minne.

1
Bevaka tråden