我有一个UIView,它有很多实例,每个实例都有一个UIRecognizer。
当点击它们时,我想删除其他人的所有识别器。
我想要它来获取该类的所有实例并删除它们的识别。
我知道ManagedObjects有[Entity allObjects];
如何创建“all objects”类方法?
答案 0 :(得分:5)
我有两个想法:
1 /创建一个包含所有实例static NSArray* instances;
的类数组,在初始化时注册它们,在解除分配时注销。该数组应该只有弱引用,否则永远不会被释放。
2 / NSNotification。所有实例都可以等待通知,如果您点击,则发送通知。
答案 1 :(得分:0)
如果您只需要查找所有实例以进行调试,则可以使用Allocations
工具并将Recorded Types
更改为仅限您的课程。这将为您提供所有对象的花花公子列表。然后,您可以使用lldb
使用他们的地址与他们互动。
答案 2 :(得分:0)
首先,我想说的是,使用NSNotificationCenter可以更好地完成您要完成的任务,也就是说,如果您仍然需要这样做,那么以下内容将起作用并且符合ARC。
在您的.h中添加以下内容:
+(NSArray *)allInstances;
然后,将其添加到班级.m的底部:
-(id)init {
//Note, I suppose you may need to account for exotic init types if you are creating instances of your class in non-traditional ways. I see in the docs that initWithType: exists for example, not sure what storyboard calls
self = [super init];
[[self class] trackInstance:self];
return self;
}
-(void)dealloc {
[[self class] untrackInstance:self];
}
static NSMutableArray *allWeakInstances;
+(void)trackInstance:(id)instance {
if (!allWeakInstances) {
allWeakInstances = [NSMutableArray new];
}
NSValue *weakInstance = [NSValue valueWithNonretainedObject:instance];
[allWeakInstances addObject:weakInstance];
}
+(void)untrackInstance:(id)instance {
NSValue *weakInstance = [NSValue valueWithNonretainedObject:instance];
[allWeakInstances removeObject:weakInstance];
}
+(NSArray *)allInstances {
NSMutableArray *allInstances = [NSMutableArray new];
for (NSValue *weakInstance in allWeakInstances) {
[allInstances addObject:[weakInstance nonretainedObjectValue]];
}
return allInstances.copy;
}
然后,当您需要该类的所有实例时,只需调用[Class allInstances];
答案 3 :(得分:-1)
如果它们是同一视图的所有子视图,您可以迭代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
}