Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在malloc'中处理对GCD调度队列的拥有引用;记忆_Ios_Automatic Ref Counting_Grand Central Dispatch - Fatal编程技术网

Ios 如何在malloc'中处理对GCD调度队列的拥有引用;记忆

Ios 如何在malloc'中处理对GCD调度队列的拥有引用;记忆,ios,automatic-ref-counting,grand-central-dispatch,Ios,Automatic Ref Counting,Grand Central Dispatch,我正在修改一个客户端Linux应用程序(C),它保存一个malloc(ed)结构的链表,每个结构都包含一个pthread(POSIX线程) Apple强烈建议您不要使用POSIX线程,因此我将其改为使用并发GCD调度队列 源代码将在Linux和iOS之间进行维护,因此我想限制结构上的更改 为了尽量减少更改,我只是将包含pthreads的结构链表替换为单个malloced结构,该结构包含指向使用dispatch\u queue\u create()创建的并发GCD调度队列的指针 然而,我突然想到,

我正在修改一个客户端Linux应用程序(C),它保存一个malloc(ed)结构的链表,每个结构都包含一个pthread(POSIX线程)

Apple强烈建议您不要使用
POSIX
线程,因此我将其改为使用并发
GCD
调度队列

源代码将在Linux和iOS之间进行维护,因此我想限制结构上的更改

为了尽量减少更改,我只是将包含pthreads的结构链表替换为单个
malloc
ed结构,该结构包含指向使用
dispatch\u queue\u create()
创建的并发GCD调度队列的指针

然而,我突然想到,由于
ARC
,这可能不起作用。默认情况下,
ARC
不知道如何拥有对结构中对象类型的引用,尤其是那些使用
malloc()
创建的对象类型。
难道没有办法让ARC跟踪结构和/或任意内存块中包含的强引用吗?我模糊地记得苹果添加了这样一个东西,但似乎找不到。

如果你把它编译成Objective-C++源代码,你就可以做到

#import <Foundation/Foundation.h>
struct Data {
    dispatch_queue_t queue;
};
目标-C++

$ clang -x objective-c++ -fobjc-arc -c test.m
没有错误

请看一看

如果程序声明C结构或联合的成员具有非平凡的所有权限定类型,则程序是格式错误的

此限制不适用于Objective-C++

已更新

可以用C++ <代码>新< /COD> >代码>删除< /代码>。或者,如果要使用

malloc
,则需要调用结构的析构函数

#import <Foundation/Foundation.h>
#import <new>

@interface Test : NSObject
@property (nonatomic) dispatch_queue_t queue;
@end

@implementation Test
- (instancetype)init
{
    self = [super init];
    if (self)
        self.queue = dispatch_queue_create("test", NULL);
    return self;
}
- (void)dealloc
{
    NSLog(@"Test dealloced");
}
@end

struct Data {
    Test* test;
};

int main()
{
    NSLog(@"stack ===================");
    {
        Data d;
        d.test = [[Test alloc] init];
    }
    NSLog(@"stack end ===============");

    NSLog(@"new =====================");
    {
        Data* d = new Data();
        d->test = [[Test alloc] init];
        delete d;
    }
    NSLog(@"new end =================");

    NSLog(@"placement new ===========");
    {
        void* p = malloc(sizeof(Data));
        Data* d = new(p) Data();
        d->test = [[Test alloc] init];
        d->~Data();
        free(d);
    }
    NSLog(@"placement new end =======");

    return 0;
}

使用Objective-C++可以避免编译器错误,但不能解决内存管理问题。我仍然需要我的调度队列以某种方式被拥有,这样它就不会被释放。我决定回避这个问题,只需将对调度队列的强引用保存到其他地方,并将它们从malloc'ed结构中删除。为什么要投否决票?我没有清楚地描述我的问题吗?如果您认为我的问题不符合SOs标准,请解释您的想法。
#import <Foundation/Foundation.h>
#import <new>

@interface Test : NSObject
@property (nonatomic) dispatch_queue_t queue;
@end

@implementation Test
- (instancetype)init
{
    self = [super init];
    if (self)
        self.queue = dispatch_queue_create("test", NULL);
    return self;
}
- (void)dealloc
{
    NSLog(@"Test dealloced");
}
@end

struct Data {
    Test* test;
};

int main()
{
    NSLog(@"stack ===================");
    {
        Data d;
        d.test = [[Test alloc] init];
    }
    NSLog(@"stack end ===============");

    NSLog(@"new =====================");
    {
        Data* d = new Data();
        d->test = [[Test alloc] init];
        delete d;
    }
    NSLog(@"new end =================");

    NSLog(@"placement new ===========");
    {
        void* p = malloc(sizeof(Data));
        Data* d = new(p) Data();
        d->test = [[Test alloc] init];
        d->~Data();
        free(d);
    }
    NSLog(@"placement new end =======");

    return 0;
}
stack ===================
Test dealloced
stack end ===============
new =====================
Test dealloced
new end =================
placement new ===========
Test dealloced
placement new end =======