2011-08-15 8 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

おっと。 Misread。 :) –

+0

sortedArrayUsingFunctionはどうですか? –

答えて

2

これを行うもう1つの方法は、ブロックを返す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); 
} 

そして、あなたがする必要があるすべてそれはヘッダーをインポートし、それを次のように使用することです:

​​

オブジェクト作成およびプロパティルート全体を通過する必要がありません。

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]; 
}