Необходимо также заботиться при выполнении таких сравнительных тестов. Некоторые алгоритмы будут иметь поведение в большой степени зависящим от входного типа.
Берут Quicksort, например. Это - худший случай O (nВІ), но обычно O (nlogn). Для двух исходных данных того же размера.
коммивояжер (я думаю, не уверенный) O (nВІ) ( РЕДАКТИРОВАНИЕ: правильное значение 0 (n!) для грубой силы algotithm ), но большинство алгоритмов получает довольно хорошие приближенные решения намного быстрее.
Это означает, что структура сравнительного тестирования имеет к большей части времени быть адаптированной на специальной основе. Предположите писать что-то универсальное для этих двух упомянутых примеров. Это было бы очень сложно, вероятно, неприменимо, и вероятно будет давать неправильные результаты так или иначе.
Поскольку вы планируете создать подкласс UIControl, вы можете просто использовать
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
Используя это, любой класс может зарегистрировать себя в качестве цели для любых событий, которые он захочет на вашем настраиваемом контроллере.
Вы правильно поняли. Вот как я бы это сделал:
@interface TargetActionPair : NSObject
{
id target;
SEL action;
}
@property (assign) id target;
@property (assign) SEL action;
+ (TargetActionPair *)pairWithTarget:(id)aTarget andAction:(SEL)selector;
- (void)fire;
@end
@implementation TargetActionPair
@synthesize target;
@synthesize action;
+ (TargetActionPair *)pairWithTarget:(id)aTarget andAction:(SEL)anAction
{
TargetActionPair * newSelf = [[self alloc] init];
[newSelf setTarget:aTarget];
[newSelf setAction:anAction];
return [newSelf autorelease];
}
- (void)fire
{
[target performSelector:action];
}
@end
Имея этот класс, сохранить ваши пары цель / действие довольно просто:
MyCustomControl.h:
#import "TargetActionPair.h"
@interface MyCustomControl : UIControl
{
NSMutableArray * touchUpEventHandlers;
}
- (id)init;
- (void)dealloc;
- (void)addHandlerForTouchUp:(TargetActionPair *)handler;
@end
MyCustomControl.m:
#import "TargetActionPair.h"
@implementation MyCustomControl
- (id)init
{
if ((self = [super init]) == nil) { return nil; }
touchUpEventHandlers = [[NSMutableArray alloc] initWithCapacity:0];
return self;
}
- (void)dealloc
{
[touchUpEventHandlers release];
}
- (void)addHandlerForTouchUp:(TargetActionPair *)handler
{
[touchUpEventHandlers addObject:handler];
}
- (void) fireTargetsForTouchUpEvent
{
[touchUpEventHandlers makeObjectsPerformSelector:@selector(fire)];
}
@end
После этого настройте управление будет осуществляться следующим образом:
[instanceOfMyControl addHandlerForTouchUp:
[TargetActionPair pairWithTarget:someController
andAction:@selector(touchUpEvent)];