NSComparator в отдельном файле - PullRequest
       2

NSComparator в отдельном файле

1 голос
/ 15 августа 2011

У меня есть сортировочный компаратор, который мне нужно использовать в нескольких разных ViewControllers, поэтому я пытаюсь сохранить его в отдельном файле. Я читал, что должен иметь возможность поместить блок сортировки в отдельный файл, но при любом способе, который я пытаюсь использовать, мне кажется, что «нераспознанный селектор отправлен в экземпляр». Код у меня есть:

#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

Есть ли чистый способ сделать это?

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Почему вы объявляете 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];
}
2 голосов
/ 15 августа 2011

Другой способ сделать это - создать функцию 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);

Сохраняет необходимость проходить весь процесс создания объекта и свойстваroute.

Обратите внимание, что я использую соглашение об именовании Create, чтобы напомнить мне, что я должен сам выпустить объект, когда я закончу с ним.

...