Xcode 7.2.1 では、プロジェクト、WebSocket を使用するアプリ、および CocoaAsyncSocket ライブラリを使用しているアプリをアーカイブすると問題が発生します。アプリはシミュレーターまたは任意のデバイスで実行されますが、アーカイブすると、xcode は次のエラー警告を表示します。
メソッドのクラス GCDAsyncUdpSocket で:
- (void)getDelegate:(id <GCDAsyncUdpSocketDelegate>*)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr;
警告エラー:
/Users/Dennis/Desktop/WebSocketDennis/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.m:569:56: Method parameter of type '__autoreleasing id<GCDAsyncUdpSocketDelegate> *' with no explicit ownership
と
/Users/Dennis/Desktop/WebSocketDennis/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.m:569:102: Method parameter of type '__autoreleasing dispatch_queue_t *' (aka 'NSObject<OS_dispatch_queue> *__autoreleasing *') with no explicit ownership
次のような別の答えを試しました:
IDデリゲートまたはdispatch_queue_tが必要な場合、このARCの問題を修正するにはどうすればよいですか
また、プロジェクトをアーカイブする必要がある場合にのみこの問題が発生するのはなぜですか?
EDIT 1 この場合、ARCが間接的にリターンを処理する方法について誰かが考えていますか? エラー警告はメソッドでのみ表示されるためです。
.h ファイル:
- (void)getDelegate:(id <GCDAsyncUdpSocketDelegate>*)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr;
- (void)setDelegate:(id <GCDAsyncUdpSocketDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
.m ファイル:
- (void)getDelegate:(id <GCDAsyncUdpSocketDelegate> * )delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr
{
if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey))
{
if (delegatePtr) *delegatePtr = delegate;
if (delegateQueuePtr) *delegateQueuePtr = delegateQueue;
}
else
{
__block id dPtr = NULL;
__block dispatch_queue_t dqPtr = NULL;
dispatch_sync(socketQueue, ^{
dPtr = delegate;
dqPtr = delegateQueue;
});
if (delegatePtr) *delegatePtr = dPtr;
if (delegateQueuePtr) *delegateQueuePtr = dqPtr;
}
}
- (void)setDelegate:(id <GCDAsyncUdpSocketDelegate>)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously
{
dispatch_block_t block = ^{
delegate = newDelegate;
#if !OS_OBJECT_USE_OBJC
if (delegateQueue) dispatch_release(delegateQueue);
if (newDelegateQueue) dispatch_retain(newDelegateQueue);
#endif
delegateQueue = newDelegateQueue;
};
if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) {
block();
}
else {
if (synchronously)
dispatch_sync(socketQueue, block);
else
dispatch_async(socketQueue, block);
}
}
- (void)setDelegate:(id <GCDAsyncUdpSocketDelegate>)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue
{
[self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO];
}
- (void)synchronouslySetDelegate:(id <GCDAsyncUdpSocketDelegate>)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue
{
[self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES];
}
私は iOS シミュレーターと任意の実際のデバイスでプロジェクトを実行できます。問題は、プロジェクトをアーカイブしたい場合のみです。Product>Analyze または Product>Build For>Running または Testing を実行すると、完全に実行されますが、Product>Archive を実行すると、または Product> Build For>Profiling エラー警告が表示されます
ありがとう!