Get all instances of a class in objective c?

2020-03-30 04:34发布

问题:

I have a UIView that has many instances and each one of them has a UIRecognizer.

When on of them is tapped I want to remove all the recognizers of the others.

What I want it to get all the instances of the class and remove their recognizes.

I know ManagedObjects has [Entity allObjects];

How can I create my "all objects" class method ?

回答1:

I have two ideas:

1/ Create a class array with all the instances static NSArray* instances;, register them when initializing, unregister when deallocating. The array should have only weak references, otherwise they will never be deallocated.

2/ NSNotification. All instances can wait for a notification and if you tap, you send the notification.



回答2:

If you just need to find all instances for debugging purposes, you can use the Allocations instrument and change the Recorded Types to only your class. This will give you a dandy list of all your objects. You can then interact with them using lldb by using their address.



回答3:

If they're all subviews of the same view, you could iterate over parentView.subviews and find them that way. Something like this:

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

Another, more efficient, option would be to have a flag in your view controller that you set when the first recognizer is triggered and use to short-circuit any future recognizer handler calls. Something like this:

@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
}