Objective-C传递方法参考作为参数

时间:2013-12-25 01:52:57

标签: objective-c methods reference

我已经看到很多关于这个主题的讨论,但没有一个在Xcode 5.x中实际工作,特别是使用ARC。我有一个简单的问题:

我需要将方法引用传递给CreateButton方法,以便在调用按钮时调用我的自定义函数,而不是通用函数。

我尝试使用(SEL)类型,但这不适用于ARC。我尝试过使用& func方法,但声称我还没有宣布该功能。

所以我的需要是:

A类调用 B类并通过信息发送以制作UIButton。在该通话中,我想在参考中发送操作:方法。我确信这是常规的,但我似乎找不到iOS 7 / Xcode 5.x方法。我还回顾了O'Reilly iOS 7基础知识和食谱代码,无法在任何地方找到这个。

谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

当我必须传递选择器时,我会将它们转换为NSStringFromSelector()的字符串,然后返回到NSSelectorFromString()的选择器。

传递琴弦要容易得多。您可以将它们存储在集合(数组,字典)中,序列化和反序列化它们,它们将自然地与ARC一起工作。

示例:

在您收集信息以创建按钮的A类中:

NSString *selectorString = NSStringFromSelector(@selector(yourActionMethodNameHere:));
// Gather more information needed by Class B here, then package
// it all up into a dictionary, for example
NSDictionary *buttonInfo = @{@"selectorString": selectorString, /* more stuff here */};

此时,您可以在类B中调用按钮构造方法,传递buttonInfo,其中包含该帮助方法所需的所有信息,包括选择器。该方法可以将字符串转换回选择器并使用它,如下所示:

SEL actionSelector = NSSelectorFromString(buttonInfo[@"selectorString"]);
// configure your button to use actionSelector here

答案 1 :(得分:1)

您应该能够使用SEL参数吗?我知道我以前做过的。 ARC可能会抱怨并给你一个警告,但它不会编译失败。这只是一个警告,因为它无法弄明白该做什么记忆。

如果你真的不能让它工作,另一个选择是使用一个块,所以你可以调用你的方法

[objectA performMethodWithParam:paramA paramb:paramB completion:^{ ... do somethhing ... }];

然后在那个方法中你可以调用

completion();

而不是实际调用方法。

另一种选择是使用委托模式。创建一个定义@protocol等方法的classADidFinish,然后让B类实现该方法。然后将classB的实例设置为classA实例的委托,并在完成后调用该方法。

这两种方法都会阻止ARC对你呻吟。

但正如我所说,使用SEL params应该可以正常工作。有一种方法你甚至可以让编译器停止向你显示警告,但它有点难看。