我希望我的班级检测到一个新实例与某些现有实例等效(相对于 vis isEqual
: 和hash
),并且只创建唯一实例。这是我认为可以完成工作的代码,但我担心它会做一些我无法发现的愚蠢的事情......
假设它是这样的 NSURLRequest 子类:
// MyClass.h
@interface MyClass : NSMutableURLRequest
@end
// MyClass.m
@implementation MyClass
+ (NSMutableSet *)instances {
static NSMutableSet *_instances;
static dispatch_once_t once;
dispatch_once(&once, ^{ _instances = [[NSMutableSet alloc] init];});
return _instances;
}
- (id)initWithURL:(NSURL *)URL {
self = [super initWithURL:URL];
if (self) {
if ([self.class.instances containsObject:self])
self = [self.class.instances member:self];
else
[self.class.instances addObject:self];
}
return self;
}
// Caller.m
NSURL *urlA = [NSURL urlWithString:@"http://www.yahoo.com"];
MyClass *instance0 = [[MyClass alloc] initWithURL: urlA];
MyClass *instance1 = [[MyClass alloc] initWithURL: urlA]; // 2
BOOL works = instance0 == instance1; // works => YES, but at what hidden cost?
问题:
- 在 init 中对 self 的第二个赋值看起来很奇怪,但并不疯狂。或者是吗?
- 认为第二个分配(实例1)被神奇地清理干净只是一厢情愿的编码吗?