我正在尝试设置适用于UIPageViewController的应用。我在技术上可以一次实例化所有视图并将它们放在一个数组中,但这样做会很昂贵,而且根据需要初始化视图似乎更好。我读到NSInvocation是一个静态呈现的消息 - 所以我想我可以拥有一个基本上包含:[SubclassA alloc]init], [SubclassB alloc]init], etc...
的数组,这些消息包含在NSInvocation中。然后我可以在pageViewController中返回该消息的结果:ViewControllerAfter / BeforeViewController:。
我还很陌生,所以我很可能从根本上误解了NSInvocation,但无论哪种方式,答案仍然会有所帮助。
答案 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
不是解决原始问题的好方法。它旨在动态调用方法。在大多数情况下你不需要它。