2013-03-27 2 views
3

Из моего понимания, рекомендуемый способ (с поддержкой ARC) «переданными по ссылке», как:ИОС о проходе по ссылке

-(void)somefunc:(someclass **)byref; 
// and 'someclass **' should be inferred to 'someclass * __autoreleasing *' 
// am i right? 

//or we could just explicitly define it like 
-(void)somefunc:(someclass * __autoreleasing *)byref; 

Однако из ответа на эту тему, Handling Pointer-to-Pointer Ownership Issues in ARC.

Кажется - (void) somefunc: (someclass * __ strong *) byref мог бы сделать трюк, а также (в demo2 выше ссылки).

1.-(void)somefunc:(someclass * __autoreleasing *)byref; 
2.-(void)somefunc:(someclass *__strong *)byref 

Для первого, как задокументировано Apple, он должен быть неявно переписывается компилятором как это:

NSError * __strong error; 
NSError * __autoreleasing tmp = error; 
BOOL OK = [myObject performOperationWithError:&tmp]; 
error = tmp; 

Кажется, второй один имеет лучшую производительность? Потому что он опускает процесс «присваивать значение назад» и «автореализацию». Но я редко вижу функции, объявленные таким образом. Лучше ли использовать вторую функцию для выполнения задания «передать по ссылке»?

Любое предложение или пояснение? Заранее спасибо.

ответ

-1

Вторая функция is not thread-safe/'delay safe'. первая правильнее.

та же причина, по которой блокируют блоки захвата и выполняют выборщик, сохраняет объект.


Представьте себе, что вызывающий абонент выделяет значительную ссылку на A, а затем вызывает функцию ASYNC fB. fA сделано, fB еще не вызвано .... так кто же сохраняет A тем временем?

+0

благодарит за ваш ответ. Но я не понял вашу вторую часть хорошо (представьте ...). Не могли бы вы дать мне пример кода/фрагмент? –

+0

он дважды опущен без какой-либо причины, поэтому нах .... :) –

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