При написании Objective-C важно знать, как управляется память, даже с помощью ARC.Как освободить объект, который инициализирует его самостоятельно
Вот фрагмент кода (не ARC):
(1)
NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}];
// how should I release tmpAttributedString here?
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpAttributedString.string attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}];
[tmpAttributedString release];
Вот что я в настоящее время сделать, чтобы избежать утечки памяти:
(2)
NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}];
NSString *tmpString = tmpAttrbutedString.string;
[tmpAttrbutedString release];
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpString attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}];
[tmpAttributedString release];
Мои вопросы:
Как я могу освободить
tmpAttributedString
в (1), с одним указателемNSAttributedString
и без временныхNSString
как в (2)? Является ли это возможным? (Второйinit
зависит от первогоinit
.)Что будет делать компилятор в сценарии (1)? Я имею в виду, как ARC будет вставлять релиз/autorelease для этого? Есть ли утечка памяти в (1), если включена функция ARC? (Конечно, явный вызов
release
удален с помощью ARC.)
Спасибо!
alloc и init вызываются только один раз в случае объективного объекта C? – dreamBegin
@dreamBegin Просто, чтобы убедиться. Вы имеете в виду, что я не должен повторно использовать указатель NSAttributedString и должен сделать новый? –
Разве вы не должны устанавливать все атрибуты первой инициализации NSAttributedString? Нет необходимости делать вторую NSAttributedString. –