gpt4 book ai didi

ios - 使用 NSSet 类跟踪和限制实例

转载 作者:可可西里 更新时间:2023-11-01 04:22:39 24 4
gpt4 key购买 nike

我希望我的类(class)检测到一个新实例与某个现有实例等效(相对于 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?

问题:

  1. 在 init 中对 self 的第二个赋值看起来很奇怪,但并不疯狂。或者是吗?
  2. 认为(instance1 的)第二个分配被神奇地清理只是一厢情愿的编码吗?

最佳答案

  1. 这并不疯狂,但在手动保留/ Release模式下,您确实需要事先释放 self,否则每次运行此方法时都会泄漏未初始化的对象。在 ARC 中,原始实例将自动为您释放。

  2. 参见 #1。

顺便说一句,对于通常只停留在一个答案上的任何读者,bbum 在下面的答案中包含一个线程安全实现的完整工作示例。强烈推荐给任何制作这样的类(class)的人。

关于ios - 使用 NSSet 类跟踪和限制实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com