#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 или выше.