1

我正在转换为 ARC,并且找不到任何方法来摆脱这个编译器错误而不破坏代码。

我需要将 2 个对象传递给选择器,因此我将它们都添加到数组中,如下所示,并将该数组发送到选择器:

LWPagerContent* content = nil;
NSArray* args = [NSArray arrayWithObjects:article, [NSValue valueWithPointer:&content], nil];

[self performSelectorOnMainThread:@selector(initArticlePagerContent:) withObject:args waitUntilDone:YES];

该方法访问数组,但需要修改数组中引用的地址处的对象。它应该初始化 LWPagerContent 对象,如图所示,然后该对象将由调用 performSelector 的原始方法使用。

- (void)initArticlePagerContent:(NSArray*)args {
Article* article = [args objectAtIndex:0];

LWPagerContent** contentPtr = [[args objectAtIndex:1] pointerValue];
*contentPtr = [[NSClassFromString([StyleSheet articleContentClass]) alloc] initWithArticle:article];

}

这很好用,但是当我尝试转换为 ARC 时,我立即被告知"Implicit conversion of a non-Objective-C type 'void *' to 'LWPagerContent *__strong *' is disallowed with ARC". 此错误发生在以(上面显示的倒数第二个)开头的行上"LWPagerContent **..."。我已经尝试过使用__bridge__autoreleasing其他帖子中的建议,但似乎没有任何效果。任何建议都非常感谢。

4

3 回答 3

7

使用块进入主线程,消除了 -performSelector: 调用所隐含的元编程。

然后使用回调来设置生成的内容。

IE

dispatch_sync(dispatch_get_main_queue(), ^{
    LWPagerContent *newContent = ... do something ...
    [self setPagerContent:newContent];
});

一些注意事项:

  • init...除非是初始化方法,否则不应调用方法

  • 通常要避免通过引用传递

  • 元编程破坏了编译器进行完整性检查的能力。躲开它。

于 2013-02-12T21:13:37.300 回答
1

编译器不知道如何处理您的原始指针。您应该明确说明您期望什么样的内存管理策略。在您的情况下,它可能类似于

LWPagerContent * __strong *contentPtr = (LWPagerContent * __strong *)[[args objectAtIndex:1] pointerValue];

类型是“指向强指针的指针LWPagerContent”。从现在开始*contentPtr将被 ARC 视为强指针。

于 2013-02-12T21:17:42.330 回答
0

你有没有尝试过:

NSValue* contentPtrPtr = [args objectAtIndex:1];
LWPagerContent** contentPtr = [contentPtrPtr pointerValue];
于 2013-02-12T21:10:08.737 回答