簡體   English   中英

如何在NSInvocation中存儲一個初始化調用?

[英]How to store an init call in an NSInvocation?

我正在嘗試設置與UIPageViewController一起使用的應用程序。 從技術上講,我可以立即實例化所有視圖並將它們放置在數組中,但這會很昂貴,並且根據需要初始化視圖似乎更好。 我讀到NSInvocation是靜態呈現的消息-所以我想我可以擁有一個基本上包含以下內容的數組: [SubclassA alloc]init], [SubclassB alloc]init], etc... ,這些消息包裝在NSInvocation中。 然后,我可以在pageViewController:ViewControllerAfter / BeforeViewController:中返回該消息的結果。

我在這方面還很新,所以從根本上我可能會誤解NSInvocation,但是無論哪種方式,答案仍然會有所幫助。

NSInvocation用於處理直到運行時才知道參數的方法或數量/類型的調用。 在這里,調用的方法在編譯時是固定的。 您不需要NSInvocation

如果要存儲要作為對象執行的動作,可以將其放入數組中,則應使用塊。

聽起來像您想要某種惰性實例化。

您可以使用此幫助程序類

@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不是解決您原始問題的好方法。 它旨在動態調用方法。 在大多數情況下,您不需要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM