Получить все экземпляры класса в цели c? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть UIView, у которого есть много экземпляров, и у каждого из них есть UIRecognizer.

Когда нажата одна из них, я хочу удалить все распознаватели остальных.

Что я хочу, чтобы получить все экземпляры класса и удалить их распознает.

Я знаю, что ManagedObjects имеет [Entity allObjects];

Как я могу создать свой метод класса "все объекты"?

Ответы [ 3 ]

5 голосов
/ 15 декабря 2011

У меня есть две идеи:

1 / Создать массив классов со всеми экземплярами static NSArray* instances;, зарегистрировать их при инициализации, отменить регистрацию при освобождении. Массив должен иметь только слабые ссылки, иначе они никогда не будут освобождены.

2 / NSNotification. Все экземпляры могут ожидать уведомления, и если вы нажмете, вы отправите уведомление.

0 голосов
/ 26 ноября 2015

Если вам просто нужно найти все экземпляры для целей отладки, вы можете использовать инструмент Allocations и изменить Recorded Types только на свой класс. Это даст вам список всех ваших предметов. Затем вы можете взаимодействовать с ними, используя lldb, используя их адрес.

0 голосов
/ 15 декабря 2011

Если все они являются подпредставлениями одного и того же представления, вы можете выполнить итерацию по parentView.subviews и найти их таким образом.Примерно так:

for (UIView *v in parentView.subviews) {
    if ([v isKindOfClass:[MyViewClass class]]) {
        // remove recognizer here
    }
}

Другой, более эффективный вариант - иметь флаг в вашем контроллере представления, который вы устанавливаете при срабатывании первого распознавателя, и использовать для короткого замыкания любых будущих вызовов обработчика распознавателя.Как то так:

@property (nonatomic) BOOL shouldRespondToEvent;
@synthesize shouldRespondToEvent=_shouldRespondToEvent;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.shouldRespondToEvent = YES;
    // other viewDidLoad stuff here
}

- (void)gestureHandler:(UIGestureRecognizer*)recognizer {
    if (!self.shouldRespondToEvent)
        return;
    self.shouldRespondToEvent = NO;
    // rest of handler code here
}
...