Ios 如何在malloc'中处理对GCD调度队列的拥有引用;记忆
我正在修改一个客户端Linux应用程序(C),它保存一个malloc(ed)结构的链表,每个结构都包含一个pthread(POSIX线程) Apple强烈建议您不要使用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调度队列的指针 然而,我突然想到,
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 =======