2013-05-07 4 views
2

У меня есть приложение с поддержкой ARC, которое использует статическую библиотеку MRC (non-ARC). В статической библиотеке retain/release переопределены для обеспечения некоторого пользовательского слабого режима ref/cache ([super retain/release] называется, конечно). Проблема в том, что поскольку retain/release не разрешены в коде с поддержкой ARC, нормально ли использовать классы, которые переопределяют retain/release в коде с поддержкой ARC? На данный момент это работает хорошо, но я не уверен, что это зависит от неопределенного поведения, которое может сломаться в будущем.переопределить сохранение/освобождение в ARC

Также в чем причина запрета переопределения retain/release? Это потому, что компилятор выполнил некоторую специальную оптимизацию, которая обходит процесс связывания сообщений, чтобы ускорить вызов метода? Я знаю, что вызовы _objc_storeStrong генерируются компилятором, который выполняет подсчет ссылок, значит ли это, что переопределенные retain/release не могут быть вызваны в ARC?

+0

ARC просто поддерживает управление памятью самостоятельно, то есть на простом языке он автоматически добавляет код сохранения/освобождения в соответствии с областью действия объекта. Так что, если вы не беспокоитесь о библиотеке, которая не поддерживает ARC, она не создаст никаких проблем в будущем. –

ответ

6

Пока классы компилируются без ARC (который вы можете контролировать на файл с помощью файла основы, перейдите на строительство Фаз и добавить -fno-objc-arc как флаг в любой файл, который должен быть составленным MRR в противном случае проект ARC'd), тогда скомпилированные классы MRR могут отменить сохранение/освобождение/авторекламу до их содержимого.

Сохранение/освобождение/автореферация являются verboten под ARC, потому что ARC предназначен для управления всем управлением памятью для вас во время компиляции, а также для того, чтобы вы могли отделить управление памятью от других ролей, которые, по-видимому, могут быть сведены к управлению памятью, но на самом деле они не принадлежат.

Например, наиболее типичным переопределением release является проверка retainCount и, если оно равно 2, то переход на 1 означает «вернуть этот объект в кеш для последующего извлечения», тогда как кеш отвечает за окончательный сохраненная ссылка на объект.

Он работает, но он ужасно хрупок, и есть более эффективные решения, не требующие слияния кэширования с управлением памятью.

-4

Недопустимое превышение сохранности/освобождения. Но если вам это нужно:

-(id)retain 
{ 
    NSIncrementExtraRefCount(self); 
    return self; 
} 

-(void)release 
{ 
    if(NSDecrementExtraRefCountWasZero(self)) 
    { 
     NSDeallocateObject(self); 
    } 
} 

-(id)autorelease 
{ // Add the object to the autorelease pool 
    [NSAutoreleasePool addObject:self]; 
    return self; 
} 

Я не тестировал их для ARC. И оригинальная статья: link

+0

и что не так с моим ответом? – user2159978

+7

Вы не можете отменить сохранение/освобождение в ARC. И, даже если бы вы могли, это не отвечает на вопрос. – bbum

+0

и? не могу ли я отметить этот класс только для использования без ARC? – user2159978

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