2015-12-03 1 views
1

Есть много причин, почему это имеет значение. Вот простой пример, если вы не использовали ARC.В Objective-c выполняется функция Performer, исполняемая inline или отправленная для выполнения как другое событие?

[instance performSelector:selector withObject:objectA]; 
[objectA release]; // Did the selector actually finish executing 
         // in the line above so everyone's done with objectA 
         // or did the selector merely get scheduled in the line 
         // above, and is yet to execute, so objectA had better 
         // not be released yet? 

Я сделал некоторые исследования и подсказки контекста, похоже, указывает на то, что селектор становится выполненным inline. Но я не видел каких-либо окончательных утверждений в любом месте, где бы я ни выглядел, который утверждает, что он запускается встроенным.

ответ

2

performSelector:withObject: выполняется синхронно (блокировка до завершения метода).

Используйте performSelector:withObject:afterDelay:, чтобы выполнить метод асинхронно в основном потоке (немедленно верните и выполните позже).

Использовать performSelectorInBackground:withObject:, чтобы выполнить метод асинхронно в фоновом потоке (немедленно вернуть и выполнить в другом потоке).

Примечание: performSelector и его друзей следует избегать, поскольку это неопределенное поведение, если вы используете их по методу с несовместимой сигнатурой метода.

Аргумент aSelector должен идентифицировать метод, который не принимает аргументов. Для методов, возвращающих ничего, кроме объекта, используйте NSInvocation.

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html#//apple_ref/occ/intfm/NSObject/performSelector:

+0

@JoshCaswell Это не очень устарело (я обновил формулировку), но, как говорится в документе, 'NSInvocation' должен использоваться большую часть времени. использование 'performSelector' может легко добавлять ошибки, которые трудно поймать. (например, подпись метода изменения из '' NSNumber' '' '') –

+0

Я не хотел задавать 2 вопроса в 1, но я также вижу, что много болтовней о селекторах не может вернуть примитив и т. д.Но я не могу найти окончательного утверждения, говорящего: «все селекторы должны возвращать NSObject». На самом деле все мои селекторы - (void) myFunction. Они работают, но тем не менее это то, что я делаю технически незаконным? –

+0

@JoeC Да, это неопределенное поведение. Если вы возьмете аргумент return и сделаете что-нибудь с ним, приложение, скорее всего, выйдет из строя. (это может зависеть от arch/platform/version) –

0

ли селектор фактически закончить выполнение в строке выше, так все сделано с Objecta или сделал селектор просто получить по расписанию в строке выше, и еще выполнять, так objectA лучше не быть выпущен еще?

Это не имеет значения, для целей управления памятью. Управление памятью в какао local - вам нужно только заботиться о том, что делает ваша функция; вам не нужно знать, и не должно волновать, какие другие функции делают внутри, правильно управлять памятью (игнорируя циклы сохранения). До тех пор, пока вы закончите свою собственную ссылку, вы должны ее освободить. Для вас это не важно, если с этим справятся другие люди.

Это связано с тем, что в соответствии с правилами управления памятью какао любая функция, которая должна хранить ее для использования вне вызова функции, требуется для ее сохранения и освобождения, когда она выполнена (поскольку функция не может предположить, что объект живет за пределами область вызова в противном случае). Любая функция, которая использует аргумент асинхронно (например, performSelector:withObject:afterDelay: и т. Д.), Действительно сохраняет объект и освобождает его, когда это будет сделано.

Альтернативно, подумайте об этом так: Как работает ARC? Как ARC знает, использует ли функция свой аргумент синхронно или асинхронно? Это не так. Нет аннотации, которая сообщает компилятору, использует ли функция что-то синхронно или асинхронно. Тем не менее ARC делает это правильно. Это означает, что вы тоже можете, не зная, использует ли функция свой аргумент синхронно или асинхронно.