2014-06-21 5 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

게으른 인스턴스 생성과 같은 소리가납니다. 다른 사람이 말했듯이

당신은 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]; 

을 사용할 수 있습니다. 메소드를 동적으로 호출하도록 설계되었습니다. 대부분의 경우 필요하지 않습니다.

1

NSInvocation은 런타임까지 메소드 또는 메소드의 수/유형을 모르는 경우 호출을 조작하기위한 것입니다. 여기에서 호출되는 메소드는 컴파일시 고정되어있다. NSInvocation은 필요하지 않습니다.

배열을 넣을 수있는 개체로 수행 할 작업을 저장하려면 블록을 사용해야합니다.