2014-06-21 18 views
0

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

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

+0

我覺得你誤解的是UIPageViewController。沒有必要預先存儲任何調用。通過確定需要什麼視圖控制器並創建,配置並返回它,只需作爲委託進行響應。 – matt

+0

我知道,但我想也許最好的方法是將這些調用存儲在一個數組中,並通過索引返回它們。 – PopKernel

+0

委託模式的思想是,您根據需要創建視圖控制器,並且UIPageViewController可以保存那些需要的並釋放不再需要的控制器。預先創建/配置VC對於少數幾個(2-4)是可以的,但請記住,一旦顯示它們,它們將保留完整的視圖層次並填充內存。 –

回答

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是不是你原來問題一個很好的解決方案。它旨在動態調用方法。大多數情況下你不需要它。

1

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

如果您想要將操作存儲爲可放入數組的對象,則應使用塊。

相關問題