开发者

Am I leaking memory here?

开发者 https://www.devze.com 2022-12-25 21:26 出处:网络
Consider the following method, where I build a string and return it. I would like to release the building blocks of the string, but then the string is based on values that no longer exists. Now what?

Consider the following method, where I build a string and return it. I would like to release the building blocks of the string, but then the string is based on values that no longer exists. Now what?

Am I leaking memory and if so, how can I correct it?

- (NSString) getMiddahInEnglish:(int)day{
NSArray *middah = [[NSArray alloc] initWithObjects:@"Chesed", @"Gevurah", @"Tiferes", @"Netzach", @"Hod", @"Yesod", @"Malchus"];
NSString *firstPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day% 7)-1]];
NSString *secondPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day / 7)]];

NSString *middahStr = [NSString string@"%@ She'bi开发者_如何学Python@%", firstPartOfMiddah, secondPartOfMiddah];

[middah release];
[firstPartOfMiddah release];
[secondPartOfMiddah release];

return middahStr;

}

At the end of the method, the return string, middahStr has not been released. Is this a problem? Am I leaking memory?


Quite the opposite: You are over-releasing.

middah you alloc and init. Then you release it. All is well.

firstPartOfMiddah and secondPartOfMiddah, you call an NSString "stringWith" convenience method. This is equivalent to invoking alloc, init, and autorelease. Your releasing them is a mistake, as they are essentially given to autorelease to release later.

middahStr you call the convenience method, but return it. All is well. It will be released later by the autorelease pool.

Rule of thumb (I'm sure there are plenty of exceptions): If you don't alloc it, don't release it.

0

精彩评论

暂无评论...
验证码 换一张
取 消