Mar*_*rov 5 objective-c nsarray ios
我需要一个类,它具有NSArray的所有方法,其行为方式相同,但修改了2个方法.
我想在我的自定义类中覆盖这两个方法:
1)countByEnumeratingWithState:objects:count:
2)objectAtIndex:
经过数小时的研究,我认为没有任何合理的方法,因为:
我不想使用类别,因为并非所有NSArray实例都应该具有修改后的行为.(加上警告)
我不想重写所有初始化程序加上所有的arrayWith ...方法+原始方法+实现我自己的存储(因为这个功能已经在Cocoa中实现了,对不对?为什么我要重新实现一个已经在那里的班级?)
如果我让我的自定义类继承NSObject并使用NSArray作为ivar中的存储,那么在Xcode中编程时,所有NSArray的方法都不可用(即使我可以将它们转发到NSArray ivar)
我通过使用method_setImplementation(...)按需覆盖方法实现取得了一些成功,但仍然无法找到一种方法来动态创建在运行时创建的类,然后将自定义实现我提到的2种方法.
期待您的想法!谢谢
Mantra: 如果某些事情很难(或者看起来它需要的代码多于必要的代码),那么你的设计很可能与iOS/OS X框架的设计原理背道而驰.它可以为重新审视您的设计提供更好的解决方案.
要回答原始问题,如果要子类化NSArray(或NSMutableArray),则需要实现原始方法,不多也不少.
原始方法是@interface在类本身中声明的方法.即:
@interface NSArray : NSObject
- (NSUInteger)count;
- (id)objectAtIndex:(NSUInteger)index;
@end
Run Code Online (Sandbox Code Playgroud)
对于NSMutableArray:
@interface NSMutableArray : NSArray
- (void)addObject:(id)anObject;
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- (void)removeLastObject;
- (void)removeObjectAtIndex:(NSUInteger)index;
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
@end
Run Code Online (Sandbox Code Playgroud)
如果您继承NSMutableArray并实现上述7个方法(NSArray中的两个方法),那么您将拥有一个兼容的NSMutableArray子类 - 假设您的方法已正确实现 - 所有API都使用可变数组.
这是因为类集群的设计方式.公共课是抽象的; 永远不会直接实例化.它们提供了一个原始接口,它包含类的核心功能,然后是根据原语实现的所有其他非原始API(除了初始化器,见下文)的具体实现.然后,具体的私有子类覆盖所有基元和一些非基元,以便为特定配置提供最佳行为.
我想为我正在处理的库创建一个NSArray实例,我想让它为我的库用户透明地工作.IE浏览器.对于他们来说,使用普通的NSArray和我将要提供的修改后的类别应该没有区别.IE浏览器.它是一个存储问题,最终用户不应该关注它,并且接口应该保持与NSArray相同 - 因此在这一点上失去所有init方法并不是一个真正的选择.
初始化方法不是原始接口的一部分NSArray.您正在添加一个要求,除了文档中定义的"使类与NSArray/ 兼容NSMutableArray"之外.没问题,只是指出来.
之所以出现这种情况,是因为它是非常罕见的子类的集合类提供你所描述的那种业务逻辑.集合在其行为方面非常通用,而条件化集合行为的此类业务逻辑将在管理整个模型层对象图的类中完成.
如果您真的想这样做,请提供init*您想要的任何方法的实现,根据需要调用包装的通用实例.初始化器的实现没有什么特别之处,你这样做会失去很多.
也不需要实现所有这些.实现一个或两个,并在其余部分上@throw描述性异常.
如果你决定要转发接受VAR-ARGS的那些,你不能直接因为没有va_list的接受方法.相反,您需要将参数的va_list转换为语言数组(即id[] foo = malloc(... * sizeof(id));)并将其传递给initWithObjects:count:.
其他一些评论:
你正在做什么[在子类中提供完整的NS*Array接口]似乎很难,因为它不是一个常见的模式,框架设计者认为没有必要创建一个支持它的设计.原始集合级别的自定义行为几乎总是在对象图形中的更高级别更好地实现. 几乎总是如此.
method_setImplementation()和动态类创建在学术上很有趣,但几乎从来都不是解决方案.显然,使用NSArray或NSMutableArray类(或具体实现类)进行混乱将会破坏依赖于标准行为的其余框架.除此之外,它是一种动态OO组合模式,并不是真正用于Objective-C; 维持这个屁股会很痛苦.
| 归档时间: |
|
| 查看次数: |
1797 次 |
| 最近记录: |