2011-08-15 6 views
1

필자는 몇 가지 다른 ViewController에서 사용해야하는 정렬 비교자를 가지고 있으므로 별도의 파일로 유지하려고합니다. 나는 별도의 파일에 정렬 블록을 넣을 수 있어야한다는 것을 읽었지 만, 어느 방법을 사용해도 "인식 할 수없는 셀렉터를 인스턴스로 보낸다"는 것을 시도합니다. 내가 가진 코드는 다음과 같습니다NSComparator in Separate File

#import <Foundation/Foundation.h> 

typedef NSComparator (^IntBlock)(id obj1, id obj2); 

@interface Utils : NSObject { 
    NSComparator SortObjNameComparer; 
    NSComparator SortObjPriceComparer; 
} 
@property (readwrite, copy) NSComparator SortObjNameComparer; 
@property (readwrite, copy) NSComparator SortObjPriceComparer; 

내가

Utils *comp = [[Utils alloc] init]; 
if(segmentedControl.selectedSegmentIndex == 0){ 
    self.productArray = [self.productArray sortedArrayUsingComparator:[comp SortObjNameComparer] context:nil]; //EXC_BAD_ACCESS  
} else if(segmentedControl.selectedSegmentIndex == 1){ 
    self.productArray = [self.productArray sortedArrayUsingComparator:[Utils SortObjPriceComparer]];// EXC_BAD_ACCESS 

이 할 수있는 깨끗한 방법이 있나요

을 사용하고이를 정렬하려면?

+0

와우. 잘못 읽다. :) –

+0

sortedArrayUsingFunction은 어떻습니까? –

답변

2

또 다른 방법은 블록을 반환하는 C 함수를 만드는 것입니다. 이 블록을 만들 수 있습니다 그런 식으로 당신이 원하는 위치 :

예를 들어

MyComparator.h

#import <Foundation/Foundation.h> 

NSComparator CreateObjNameComparer(void); 
NSComparator CreateObjPriceComparer(void); 

MyComparator.m 다음

#import MyComparator.h 

NSComparator CreateObjNameComparer(void) { 
    NSComparator myComparator = ^(id obj1, id obj2) { 
     // Your definition here 
    }; 
    return Block_copy(myComparator); 
} 

NSComparator CreateObjPriceComparer(void) { 
    NSComparator myComparator = ^(id obj1, id obj2) { 
     // Your definition here 
    }; 
    return Block_copy(myComparator); 
} 

그리고 모두 당신이 필요 헤더를 가져 와서 다음과 같이 사용하는 것입니다 :

NSComparator nameComparator = CreateObjNameComparor(); 
// Use the block 
Block_release(nameComparator); 

전체 개체 작성 및 속성 경로를 거쳐야 함을 저장합니다.

Create 명명 규칙을 사용하여이 작업을 완료 할 때 객체를 직접 릴리스해야 함을 상기시킵니다.

+0

이것은 유망 해 보입니다. 나는 내일에 그것을 줄 수있다. 감사. – Echilon

+0

우수, 감사합니다. – Echilon

3

IntBlock을 NSComparator를 반환하는 블록으로 선언하는 이유는 무엇입니까? 또한 블록은 기본적으로 스택에 할당되므로 올바르게 수행하는 속성을 초기화 할 때 반드시 확인해야합니다. 블록의 초기화를 게시하면 질문에 답변하는 데 도움이되지만 구현은 이와 비슷하게 보입니다.

-(id)init 
{ 
    if((self = [super init])) 
    { 
     //Make sure you use self. 
     self.SortObjNameComparer = ^(id obj1, id obj2){ return NSOrderedSame; }; 
     self.SortObjPriceComparer = ^(id obj1, id obj2){ return NSOrderedSame; }; 
    } 
    return self; 
} 

-(void)dellaoc 
{ 
    Block_release(SortObjNameComparer); 
    Block_release(SortObjPriceComparer); 

    [super dealloc]; 
}