Objective C - 如何像 NSMutableDictionary 一样使用键保持对多个对象的引用
Objective C - How To Keep Reference To Multiple Objects With Keys Just Like How NSMutableDictionary Works
我刚刚学会了如何使用 KVO
,但只是基础知识。我需要实现的是这样的:
我有一个传递 Speaker
对象的委托调用。
- (void)onSpeakerFound:(Speaker *)speaker
一旦我在 UI 部分收到这个 Speaker
,我将从那里为这个对象分配观察者。
但是,这只是一位演讲者。如果我有多个扬声器要跟踪怎么办。我需要为这些发言者分别分配观察员,同时我希望保留他们的参考资料以进一步更新这些值。
每个演讲者都可以不时更新。因此,当我注意到扬声器发生变化时,我希望访问对该扬声器的引用并更新值,就像 NSMutableDictionary
的工作方式一样。
NSMutableDictionary
为它创建一个对象的副本,所以如果我再次从字典中获取它,它将是一个不同的对象。
那么,有没有 class 允许我通过只保留对该对象的引用而不复制它来跟踪该对象?
编辑:一项测试,用于验证当在 NSMutableDictionary
中设置实例化对象时,实例化对象未被 NSMutableDictionary
中设置的对象引用。
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *obj = @"initial value";
NSString *key = @"key";
[dict setObject:obj forKey:key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
obj = @"changed value";
NSLog(@"Object is now %@", [dict objectForKey:key]);
}
日志:
2016-07-26 21:04:58.759 AutoLayoutTest[49723:2144268] Object is now initial value
2016-07-26 21:04:58.761 AutoLayoutTest[49723:2144268] Object is now initial value
NSMutableDictionary makes a copy of an object set to it...
这是不正确的;它将向对象添加一个 reference。它将是 Objective-C 集合内外引用的同一个对象。
So, is there a class that allows me to keep track of an object...?
可能 NSMutableSet
如果您只想要一个对象列表。这将确保您拥有对每个对象的唯一引用,但是您需要在这些对象上实现方法 hash
和 isEqual
以便它们正确运行。否则 NSMutableDictionary
如果你想按键快速查找。
-试试这个
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *obj = @"initial value";
NSString *key = @"key";
[dict setObject:obj forKey:key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
obj = @"changed value";
[dict setObject:obj forKey:Key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
}
我刚刚学会了如何使用 KVO
,但只是基础知识。我需要实现的是这样的:
我有一个传递 Speaker
对象的委托调用。
- (void)onSpeakerFound:(Speaker *)speaker
一旦我在 UI 部分收到这个 Speaker
,我将从那里为这个对象分配观察者。
但是,这只是一位演讲者。如果我有多个扬声器要跟踪怎么办。我需要为这些发言者分别分配观察员,同时我希望保留他们的参考资料以进一步更新这些值。
每个演讲者都可以不时更新。因此,当我注意到扬声器发生变化时,我希望访问对该扬声器的引用并更新值,就像 NSMutableDictionary
的工作方式一样。
NSMutableDictionary
为它创建一个对象的副本,所以如果我再次从字典中获取它,它将是一个不同的对象。
那么,有没有 class 允许我通过只保留对该对象的引用而不复制它来跟踪该对象?
编辑:一项测试,用于验证当在 NSMutableDictionary
中设置实例化对象时,实例化对象未被 NSMutableDictionary
中设置的对象引用。
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *obj = @"initial value";
NSString *key = @"key";
[dict setObject:obj forKey:key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
obj = @"changed value";
NSLog(@"Object is now %@", [dict objectForKey:key]);
}
日志:
2016-07-26 21:04:58.759 AutoLayoutTest[49723:2144268] Object is now initial value
2016-07-26 21:04:58.761 AutoLayoutTest[49723:2144268] Object is now initial value
NSMutableDictionary makes a copy of an object set to it...
这是不正确的;它将向对象添加一个 reference。它将是 Objective-C 集合内外引用的同一个对象。
So, is there a class that allows me to keep track of an object...?
可能 NSMutableSet
如果您只想要一个对象列表。这将确保您拥有对每个对象的唯一引用,但是您需要在这些对象上实现方法 hash
和 isEqual
以便它们正确运行。否则 NSMutableDictionary
如果你想按键快速查找。
-试试这个
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *obj = @"initial value";
NSString *key = @"key";
[dict setObject:obj forKey:key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
obj = @"changed value";
[dict setObject:obj forKey:Key];
NSLog(@"Object is now %@", [dict objectForKey:key]);
}