如何在NSInvocation中存储init调用?

时间:2014-06-21 14:56:47

标签: objective-c nsarray uipageviewcontroller nsinvocation

我正在尝试设置适用于UIPageViewController的应用。我在技术上可以一次实例化所有视图并将它们放在一个数组中,但这样做会很昂贵,而且根据需要初始化视图似乎更好。我读到NSInvocation是一个静态呈现的消息 - 所以我想我可以拥有一个基本上包含:[SubclassA alloc]init], [SubclassB alloc]init], etc...的数组,这些消息包含在NSInvocation中。然后我可以在pageViewController中返回该消息的结果:ViewControllerAfter / BeforeViewController:。

我还很陌生,所以我很可能从根本上误解了NSInvocation,但无论哪种方式,答案仍然会有所帮助。

2 个答案:

答案 0 :(得分:1)

NSInvocation用于操作调用,直到运行时才知道参数的方法或数量/类型。这里,调用的方法在编译时是固定的。您不需要NSInvocation

如果要存储要作为可放入数组的对象执行的操作,则应使用块。

答案 1 :(得分:1)

听起来你想要某种懒惰的实例化。

您可以使用此辅助类

@interface LazyObject : NSObject

@property (copy) id (^block)(void));
@property (readonly) id object;

+ (instancetype)create:(id (^)(void))block;

@end

@implementation LazyObject {
    id _object;
}

+ (instancetype)create:(id (^)(void))block
{
    LazyObject *obj = [[self alloc] init];
    obj.block = block;
    return obj;
}

- (id)object
{
    if (!_object) _object = self.block();
    return _object;
}

@end

NSArray *array = @[[LazyObject create:^id{ return [[SomeClassA alloc] init];}],
                   [LazyObject create:^id{ return [[SomeClassB alloc] init];}]];

SomeClassA *a = [array[0] object];
SomeClassB *b = [array[1] object];

正如其他人所说,NSInvocation不是解决原始问题的好方法。它旨在动态调用方法。在大多数情况下你不需要它。