在Objective-C中创建匿名委托对象

dev*_*os1 8 cocoa cocoa-touch objective-c

Cocoa广泛使用委托来提供(除其他外)异步操作的回调方法.但是,我个人讨厌委托模型以及它如何使用处理程序为非常特定的子操作污染当前类.UIAlertView是一个很好的例子.

因此,我想知道是否可以UIAlertViewDelegate通过块简单地创建满足委托协议(例如)要求的匿名委托对象,并在需要委托引用的任何地方传递此匿名对象.

我想象的是:

id myDelegate = @{
    alertView:alertView didDismissWithButtonIndex:index = ^ {
        ...
    }
};

UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:... message:... delegate:myDelegate cancelButtonTitle:... otherButtonTitles:...;
[alertView show];
Run Code Online (Sandbox Code Playgroud)

我听说Objective-C有一些很好的动态语言功能,但我不知道如何简单地向对象添加方法/选择器.这可以以相对简单的方式完成吗?

Chr*_*eux 5

是的,您提到的语言功能是通过objective-c运行时公开的,尽管没有内置工具可以动态创建委托类,而运行时api并不是最友好的.

有一个叫做A2DynamicDelegate的图书馆,它正是你所说的.我没有使用它,但它可能值得调查.

编辑:这种方法的一个问题是不保留委托,因此您需要在其他地方保留强引用,或者添加UIAlertView的关联引用.您可能会发现所有这些都不值得,只需在视图控制器中添加额外的方法就可以更好地工作(您可以在类扩展中符合委托协议以避免污染您的界面).