Это вопрос из предыдущего вопроса, который, надеюсь, немного понятнее. Мне просто любопытно, как работает код, представленный ниже, в частности, переменная myString, которая будет выпущена. Это не похоже, что это с выхода?
код
// IMPLEMENT
@implementation CelestialBody
- (void)setName:(NSString *)newName{
if(name != newName) {
[name release];
name = [newName copy];
}
}
- (void)dealloc{
[name release];
name = nil;
[super dealloc];
}
@end
.
// ------------------------------------------------------------------- **
// MAIN: 30th September 2009
// ------------------------------------------------------------------- **
#import <Foundation/Foundation.h>
#import "CelestialBody.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CelestialBody *newPlanet = [[CelestialBody alloc] init];
NSString *myString = [[NSString alloc]initWithFormat:@"go home"];
NSLog(@"RetainCount_1: %d",[myString retainCount]);
[newPlanet setName: myString];
NSLog(@"RetainCount_2: Incremented by copy in setName");
// Clean up
NSLog(@"RetainCount_2: %d -Before Release",[myString retainCount]);
[newPlanet release];
[myString release];
[pool drain];
NSLog(@"RetainCount_1: %d -After Release",[myString retainCount]);
return 0;
}
// ------------------------------------------------------------------- **
OUTPUT
Running…
2009-10-01 09:28:50.395 RetainCount_1: 1
2009-10-01 09:28:50.399 RetainCount_2: Incremented by copy in setName
2009-10-01 09:28:50.399 RetainCount_2: 2 -Before Release
2009-10-01 09:28:50.400 RetainCount_1: 1 -After Release
Debugger stopped.
В настоящее время я перечитываю Руководство по управлению памятью, чтобы попытаться увидеть, что я пропустил.
большое спасибо
EDIT
Только что добавил релиз в dealloc. Похоже, это было то, чего мне не хватало.
- (void)dealloc{
[name release];
name = nil;
[super dealloc];
}
1021 * Гэри *