【问题标题】:How can I work with this value in a method - Objective C如何在方法中使用此值 - 目标 C
【发布时间】:2012-10-25 22:28:47
【问题描述】:

我必须将以下对象传递给一个方法,让该方法修改它,以便在方法调用之后我可以继续使用我修改的对象。

AVMutableCompositionTrack *compositionVideoTrack[2];

目前这样传递:

[self buildShow:&compositionVideoTrack];

buildshow 方法如下所示:

-(void)buildShow:(AVMutableCompositionTrack**)videoTracks{
}

我收到此编译器警告,但目前无法正常工作:

不兼容的指针类型将“AVMutableCompositionTrack *__strong (*)[2]”发送到“AVMutableCompositionTrack *__autoreleasing *”类型的参数

如何更改它以使其正常工作?

【问题讨论】:

  • 除非绝对必要,否则不要使用传递引用。 Locke 在下面的回答更符合其他框架的设计理念。
  • 我的计划是让一些不同的对象被该方法修改,并且我需要运行该方法几次,因此通过 ref 传递非常适合我的需要,感谢评论!
  • 如果您有几个不同的对象被该方法修改,更好的设计是创建一个类,其中包含各种对象并提供关联它们的逻辑。将来这也可能更容易重构(因为您更改了类,而不是每个调用站点都更改为 multi-arg-pass-by-reference-method)。 (如果您查看 iOS/Cocoa API,会以非常有限的方式使用传递引用)。

标签: iphone objective-c ios ipad


【解决方案1】:

就这样传递吧:

[self buildShow:compositionVideoTrack];

当你这样声明时:

AVMutableCompositionTrack * __autoreleasing compositionVideoTrack[2];

它已经是一个指针数组,所以它与参数的类型(AVMutableCompositionTrack**)兼容。

【讨论】:

  • 试过了,我得到这个错误:Passing address of non-scalar object to __autoreleasing parameter for write-back
  • @box86rowh:查看here 了解有关此的一些信息。
  • 好的,我使用了你的答案+这样声明我的对象的组合:AVMutableCompositionTrack * __autoreleasing compositionVideoTrack[2];我会将该部分添加到您的答案中并将其标记为答案。
【解决方案2】:

除非您正在使用属性,否则您应该这样做(注意该方法现在返回相同类型的对象):

方法构造函数:

-(AVMutableCompositionTrack *)buildShow:(AVMutableCompositionTrack *)videoTracks {
    // do something
    return newVideoTracks;
}

还有,方法调用:

newVideoTracks = [self buildShow:compositionVideoTrack];

如果你使用一个属性,你可以有一个不带参数的 void 方法。

【讨论】:

  • 为了在此处发布,我简化了我的问题,我的方法需要接受多个对象,因此返回不起作用。
  • 你总是可以将多个参数传递给一个方法。您可能想考虑使用 NSArrays,或其他一些比 C 代码表现更好的原生组件。
猜你喜欢
  • 2012-06-22
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2011-10-31
  • 2018-10-28
相关资源
最近更新 更多