gpt4 book ai didi

objective-c - 通过 KVC 访问集合(以保护集合并符合 KVO)

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:25 25 4
gpt4 key购买 nike

我有一个 Test 类,它有一个 Foos 数组。我想在不直接公开 ivar 的情况下提供对 Foos 的访问。我正试图使这个 KVC 兼容(也为 KVO 兼容铺平道路)。我有:

测试.h

@interface Test : NSObject
{
NSMutableArray *foos;
}

@property (readonly, copy) NSMutableArray *foos;

@end

测试.m

- (id) init
{
self = [super init];
if (self != nil)
{
foos = [[NSMutableArray array] retain];
}
return self;
}

- (NSMutableArray*) foos
{
return [self mutableArrayValueForKey:@"foos"];
}

- (NSUInteger)countOfFoos
{
return [foos count];
}

- (id)objectInFoosAtIndex:(NSUInteger)index
{
return [foos objectAtIndex:index];
}

- (NSArray *)foosAtIndexes:(NSIndexSet *)indexes
{
return [foos objectsAtIndexes:indexes];
}

- (void)insertObject:(id)key inFoosAtIndex:(NSUInteger)index
{
[foos insertObject:key atIndex:index];
}

- (void)insertFoos:(NSArray *)foosArray atIndexes:(NSIndexSet *)indexes
{
[foos insertObjects:foosArray atIndexes:indexes];
}

- (void)removeObjectFromFoosAtIndex:(NSUInteger)index
{
[foos removeObjectAtIndex:index];
}

- (void)removeFoosAtIndexes:(NSIndexSet *)indexes
{
[foos removeObjectsAtIndexes:indexes];
}

当客户端尝试添加 Foo 时,这将进入无限循环:

Test *test = [[Test alloc] init];
NSMutableArray *foos = test.foos;
[foos addObject:@"adding object"]; // infinite loop here

我做错了什么?

最佳答案

- (NSMutableArray*) foos
{
return [self mutableArrayValueForKey:@"foos"];
}

访问者不应使用 KVC 来获取被访问属性的值;这个想法是 KVC 通过访问器,因为访问器比 KVC 更接近值。

foos 的正确实现应该返回数组的副本,可变的或其他的。以下是我的做法:

- (NSArray *) foos
{
return [[foos copy] autorelease];
}

我还会公开所有访问器。任何想要改变数组或随机访问特定索引处的元素的东西都可以这样做。它仍然是安全和封装的,因为它们通过您的访问器,而不是直接访问数组。

没有任何理由自己使用 KVC 协议(protocol)方法,除非您在编写代码时不知道将访问哪个 key 。例如,如果您正在编写 nib 加载程序或 Cocoa 绑定(bind)系统,您将使用 KVC。

关于objective-c - 通过 KVC 访问集合(以保护集合并符合 KVO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230387/

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