Определение dispatch_queue_t как сильного

#ios #objective-c #multithreading

#iOS #objective-c #многопоточность

Вопрос:

Я увидел следующую строку:

 @property (nonatomic, strong) dispatch_queue_t filterMainQueue;
 

Почему экземпляр dispatch_queue_t, который не является объектом, объявляется strong ?

Ответ №1:

Это абсолютно хорошая практика. Я хочу заметить, что начиная с OS X Mountain Lion и iOS 6.0 все объекты GCD и XPC в средах выполнения iOS / OS X теперь обрабатываются как объекты Objective-C ARC , и теперь они не являются примитивами, поэтому они будут управляться памятью так же, как обычные объекты Objective-C. Вот почему с этого момента вы должны объявлять их как strong .

Вы можете проверить это самостоятельно в object.h :

 #define DISPATCH_DECL(name) OS_OBJECT_DECL_SUBCLASS(name, dispatch_object)
 

Этот факт также указан в документах:
iOS 6 and later—Dispatch objects (including queues) are Objective-C objects, and are retained and released automatically.
OS X 10.8 and later—Dispatch objects (including queues) are Objective-C objects, and are retained and released automatically.
Earlier versions—Dispatch objects are custom objects. You must handle the reference counting manually

А также из комментариев в object.h :

  * By default, dispatch objects are declared as Objective-C types when building
 * with an Objective-C compiler. This allows them to participate in ARC, in RR
 * management by the Blocks runtime and in leaks checking by the static
 * analyzer, and enables them to be added to Cocoa collections.
 * See <os/object.h> for details.
 

Комментарии:

1.Привет, ваше утверждение основано на названии define OS_OBJECT_DECL_SUBCLASS ? Поскольку это подкласс, мы можем предположить, что теперь они являются объектами? Что было бы name и dispatch_object в этом случае? Заранее спасибо.

2. @Unheilig Мое утверждение основано не только на этом. Пожалуйста, посмотрите мои правки. Это также указано в документах, поэтому более авторитетным фактом является то, что мое собственное object.h исследование

3. Большое спасибо за объяснение, Александр!

4. Я получаю property with 'retain (or strong)' attribute must be of object type сообщение об ошибке, даже несмотря на то, что я использую OS X 10.10 SDK.

5. @Rivera Это поведение контролируется OS_OBJECT_HAVE_OBJC_SUPPORT макрокомандой, которая определена в заголовке <os/object.h> . Убедитесь, что для него установлено значение 1. И что более важно: проверьте, действительно ли ваша цель развертывания установлена на iOS 6.0 или выше.