2016-12-15 6 views
0

При написании 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]; 

Мои вопросы:

  1. Как я могу освободить tmpAttributedString в (1), с одним указателем NSAttributedString и без временных NSString как в (2)? Является ли это возможным? (Второй init зависит от первого init.)

  2. Что будет делать компилятор в сценарии (1)? Я имею в виду, как ARC будет вставлять релиз/autorelease для этого? Есть ли утечка памяти в (1), если включена функция ARC? (Конечно, явный вызов release удален с помощью ARC.)

Спасибо!

+0

alloc и init вызываются только один раз в случае объективного объекта C? – dreamBegin

+0

@dreamBegin Просто, чтобы убедиться. Вы имеете в виду, что я не должен повторно использовать указатель NSAttributedString и должен сделать новый? –

+0

Разве вы не должны устанавливать все атрибуты первой инициализации NSAttributedString? Нет необходимости делать вторую NSAttributedString. –

ответ

0

Правила для ARC относительно просты. Если вы вызываете alloc, new или copy, тогда ARC понимает, что ему нужно позвонить release по этому объекту, когда он выходит за рамки. Все остальные объекты считаются autoreleased. «Выход из сферы действия» означает либо возврат, либо переназначение переменной. В случае, когда он видит переназначение переменной, он будет неявно помещать вызов release как раз перед тем, как ему присваивается что-то еще. Если вы вернете переменную, ARC поместит на эту переменную autorelease, чтобы она могла выходить за пределы метода; любые другие существующие переменные (которые не являются автореализованными), которые не возвращаются, но все еще существуют, будут иметь неявный release, отправленный им.

Apple's official transition guide для справки.

 Смежные вопросы

  • Нет связанных вопросов^_^