Objective-C通过方法参考作为参数

Objective-C通过方法参考作为参数,objective-c,methods,reference,Objective C,Methods,Reference,我已经看到了很多关于这个主题的讨论,但是没有一个在Xcode 5.x中真正起作用,特别是在使用ARC时。我有一个简单的问题: 我需要将方法引用传递给CreateButton方法,以便在调用按钮时调用我的自定义函数,而不是某个通用函数。 我尝试过使用(SEL)类型,但这对ARC不起作用。我尝试过使用&func方法,但这表明我还没有声明函数 因此,我需要: A类调用B类并发送信息以制作UIButton。在该调用中,我想在引用中发送action:method。我确信这是例行的,但我似乎找不到一个iOS

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

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

我尝试过使用(SEL)类型,但这对ARC不起作用。我尝试过使用&func方法,但这表明我还没有声明函数

因此,我需要:

A类调用B类并发送信息以制作UIButton。在该调用中,我想在引用中发送action:method。我确信这是例行的,但我似乎找不到一个iOS 7/Xcode 5.x的方法来做。我还回顾了O'Reilly iOS 7的基本原理和食谱代码,但在任何地方都找不到讨论过的内容


谢谢您的帮助。

您应该能够使用SEL参数吗?我知道我以前做过。 ARC可能会抱怨并向您发出警告,但它不会编译失败。这仅仅是一个警告,因为它不能完全弄清楚在内存方面应该做什么

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

[objectA performMethodWithParam:paramA paramb:paramB completion:^{ ... do somethhing ... }];
然后,在这种方法中,您可以调用

completion();
而不是实际调用一个方法

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

这两种方法都能阻止电弧对你的呻吟


但正如我所说,使用SEL参数应该可以很好地工作。有一种方法可以让编译器停止显示警告,但它有点难看。

您应该能够使用SEL参数?我知道我以前做过。 ARC可能会抱怨并向您发出警告,但它不会编译失败。这仅仅是一个警告,因为它不能完全弄清楚在内存方面应该做什么

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

[objectA performMethodWithParam:paramA paramb:paramB completion:^{ ... do somethhing ... }];
然后,在这种方法中,您可以调用

completion();
而不是实际调用一个方法

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

这两种方法都能阻止电弧对你的呻吟


但正如我所说,使用SEL参数应该可以很好地工作。有一种方法可以让编译器停止向您显示警告,但这有点难看。

当我必须传递选择器时,我会将它们转换为字符串,然后返回选择器

传递字符串要容易得多。您可以将它们存储在集合(数组、字典)中,对它们进行序列化和取消序列化,它们将自然地使用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

当我必须传递选择器时,我会将它们转换为字符串,然后再转换回选择器

传递字符串要容易得多。您可以将它们存储在集合(数组、字典)中,对它们进行序列化和取消序列化,它们将自然地使用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

如何调用NSStringFromSelector()?我尝试了NSStringFromSelector(func)、self.func、[self-func]、(SEL)func。似乎什么都没用。后半部分完成并准备好了!我不断地得到一个错误,声称我的方法“func”没有在我的类中声明,当它是正确的方法进行引用时。我添加了一个小示例。显然,我对您的用例了解不够,但您可以这样做。因此出于某种原因,我在这一行的@selector上不断得到一个^error,告诉我我的方法没有声明。这与我的类的实例有关吗?该类只是引用自身。它是一个UIViewController,试图处理自己的按钮。因此,当您在我的代码中输入第一行时,由于“未声明的选择器‘test:’”而失败:(您的一个类是否实现了一个名为“test:”的方法?我终于让它工作了!非常感谢。我的一个打字错误让我很难受。ARG。您是最好的。如何调用NSStringFromSelector()?我尝试了NSStringFromSelector(func),self.func,[self func],(SEL)func。似乎什么都没用。后半部分已经完成并准备好了!我不断地收到一个错误,声称我的方法是“func”没有在我的类中声明,因为它是关于进行引用的方法的。我添加了一个小示例。显然,我对您的用例了解不够,但这就是您可以这样做的方式。TY。因此,出于某种原因,我在@selector for此行上不断收到一个^error,告诉我没有声明我的方法。这与的实例有关吗我的类?该类只是引用自身。它是一个UIViewController,试图处理它自己的按钮。因此,当您输入到我的代码中时,您的第一行无法通过“未声明的选择器测试:”:(是否