MRC vs ARC — в чём разница?
Суть
Обе модели — подсчёт ссылок: у объекта есть retain count, при нуле вызывается dealloc. Разница в том, кто расставляет retain/release/autorelease.
- MRC (Manual Reference Counting, до 2011) — программист, по правилам владения: методы
alloc/new/copy/mutableCopyвозвращают объект с +1, который вы обязаны отпустить; всё остальное — autoreleased, и если нужно сохранить, делаетеretain. - ARC (Automatic Reference Counting) — компилятор clang вставляет те же вызовы на этапе компиляции по тем же правилам (включая анализ имён методов), а оптимизатор убирает парные retain/release. Это не сборщик мусора: нет паузы, нет трассировки графа, ничего не происходит в рантайме «само».
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
#if !__has_feature(objc_arc)
// MRC: сеттер пишется вручную
@implementation Person
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (void)dealloc {
[_name release];
[super dealloc];
}
@end
#else
// ARC: компилятор генерирует то же самое из атрибута copy
@implementation Person
@end
#endif
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep