Прежде всего, у вашего кода есть пара проблем.Во-первых, вы должны определить aMutableString
@property
как retain
, а не assign
.assign
обычно предназначен для примитивных необъектных типов, таких как int
s и т. Д., А также для некоторых особых случаев объектов.Похоже, вы хотите стать владельцем aMutableString
таким образом, чтобы оно сохранялось после возврата цикла событий.В своем опубликованном коде вы заканчиваете тем, что из-за неправильной установки aMutableString
в следующей строке:
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];
Создавая NSMutableString с помощью alloc / init, вы создаете потенциальную памятьСитуация утечки, хотя в вашей ситуации она фактически компенсирует ваше определение свойства как assign
, а не сохранение.
Ваш второй -anotherMethod
также потенциально опасен в этом: 1) он освобождает переменную экземпляравы определили как assign
2) после его освобождения, он не устанавливает его на nil
.Если вы попытаетесь получить доступ к этой переменной экземпляра в другом месте этого класса в более поздний момент времени, вы, вероятно, получите сбой, потому что указатель больше не действителен, если переменная экземпляра была освобождена.
Итак,код, скорее всего, должен выглядеть примерно так:
.h
NSMutableString *aMutableString;
...
@property (retain) NSMutableString *aMutableString;
.m:
@synthesize aMutableString;
- (void)dealloc {
[aMutableString release];
[super dealloc];
}
- (void)aMethod {
[self setAMutableString:[NSMutableString stringWithString:@"message: "]];
if (someCondition) {
[aMutableString appendString:@"woohoo"];
}
}
- (void)anotherMethod {
NSLog(@"%@", aMutableString);
// the following is potentially unsafe!
// [[self aMutableString] release];
// it should be one of the following:
[aMutableString release]; aMutableString = nil;
// or
// [self setAMutableString:nil];
}
Тем не менее, без дополнительной информации это немного сложноскажи в чем проблема.Я полагаю, вы имеете в виду, что NSLog()
вызов печатает (null)
?Если это так, это означает, что aMutableString
по-прежнему nil
.Вы звоните -aMethod
перед вызовом -anotherMethod
?
Если вы хотите убедиться, что aMutableString
инициализируется пустой строкой, вы можете переопределить -init
:
- (id)init {
if ((self = [super init])) {
aMutableString = [[NSMutableString alloc] init];
}
return self;
}