Во-первых, вы хотите, чтобы соответствовать правилу метод присвоения имен, которые диктуют, что любой метод, имя которого начинается с «Alloc», «новый», «копия »Или« mutableCopy »должен иметь счет сохранения +1 (т. Е. Право собственности переносится), в противном случае это должен быть объект autorelease
(или, точнее, любой объект, чье право собственности не передано, и если вызывающий абонент хочет заявить право собственности, он должен был бы вручную retain
).
Кстати, ARC использует эти префиксы имени метода для автоматического определения семантики памяти объекта, но в режиме ручного сохранения и отпускания (MRR) нагрузка лежит на программиста, чтобы гарантировать, что управление памятью метода соответствует семантика, подразумеваемая именем метода. Следуя этому правилу присвоения имен, станет важным, если вы когда-нибудь включите этот код MRR с кодом ARC в какой-то будущий день. Есть подсказки кода, которые вы можете использовать, если у вас есть устаревший код, который нарушает соглашение об именовании этого метода, но лучше всего убедиться, что семантика памяти вашего кода соответствует этому правилу именования метода.
Независимо от этого правила именования этого метода включены в Basic Memory Management Rules, изложенные в Руководстве по программированию памяти с расширенным управлением памятью .
Итак, в ручном удержании и выпуске у вас есть один из двух вариантов. Если метод начинается с «Alloc», «новый», «копия», или «mutableCopy», то он должен передать в собственность, возвращая +1 retainCount
объект, например:
- (NSString *)newSomeString
{
return [[NSString alloc] initWithFormat:@"%d-String", 1];
}
в противном случае, он не должен передавать владение (например,возвращать autorelease
объект), например:
- (NSString *)someString
{
return [NSString stringWithFormat:@"%d-String", 1];
}
Таким образом, если абонент хочет, чтобы убедиться, что объект был сохранен, он может либо просто вызвать метод, который возвратил +1 объект:
NSString *string = [self newSomeString];
или вызвать версию, которая возвращает autorelease
объект, но затем явно retain
это:
NSString *string = [[self someString] retain];
Если вы просто изучаете Objective-C, изучите ARC вместо этого. Ручной подсчет ссылок - это еще одна вещь, которую вы можете ошибаться, и она абсолютно ничего не покупает. – godel9
Да, спасибо за совет. Но я увлекаюсь пониманием того, что на самом деле происходит под капотом. Поэтому я начал изучать счетчик ссылок вручную. – user3008132
Замечательно, что вы хотите развить глубокое понимание Objectivr-C, но я настоятельно призываю вас снова изучить Modern Objective-C/ARC. Он подчеркивает отношения между объектами, а не механический и автоматизированный подсчет ссылок. – godel9