2

我将做两件被认为是糟糕风格的事情,但我有理由,而且我对 Cocoa 解决方案持开放态度,我只是不知道它是什么。

我想要一个NSArray对 a 类型安全的类型UIView,然后NSArray是对 s 的数组类型安全的类型UIView。的二维数组UIViews

我喜欢这个,因为我已经实现了一个自定义双UITableView精度表,它在垂直表视图中具有嵌套的水平表视图。我会使用我的自定义ViewsArrayViews2DArray数据结构,其他程序员可以轻松地为我的DoubleTableView. 这是想要扩展的充分理由NSArray吗?

我遇到的问题是我已经覆盖了该方法的功能:

(NSArray *) initWithObjects:(id) firstObject ...作为:

(ViewsArray *) initWithViews: (UIView *) firstView, ...

但是 my 方法的返回值是 an NSArray,它没有包含在 my 中的其他方法ViewsArray,这意味着无法识别的选定异常。我通过创建一个包含我的视图的NSArray属性暂时解决了这个问题ViewsArray,但是当我想将我的内容提供给我的DoubleTableView.

前任:

[[self.delegate content].arraysOfViews objectAtIndex:indexPath.section];

代替

[[self.delegate content] objectAtIndex:indexPath.section];

我知道这是几个字母,但我正在尽我所能写出好的代码。

我怎样才能返回self我的initWithViews并拥有我添加的,等NSArray属性?(铸造?)我是否在考虑这个错误(使用 Java/typesafity ...)?像这样的数据结构的最佳解决方案是什么?greatestHeighttotalWidth

编辑:

为了以我认为“时尚”的方式解决我的问题,我做了以下事情:

这是我的标题(注意它是一个 NSObject):

@interface ViewsArray : NSObject

@property int greatestHeight;
@property int greatestWidth;
@property int totalWidth;

- (ViewsArray *) initWithViews: (UIView *) firstView, ...;
- (UIView *) getViewAtIndex: (NSInteger) index;
- (NSUInteger) viewCount;

@end

这是在我的实现中:

@interface ViewsArray ()

@property (retain, nonatomic) NSArray *views;

@end

这意味着我只管理一个私有 NSArray。允许漂亮的参考。

我今天学到的东西:阅读该死的文档并接受你的语言。我知道这个实例可能不会显示最后一个,但我更接近;)

4

1 回答 1

5

简单的解决方案; 不要打扰

在使用和调试使用 NSArray/NSDictionary API 的 Objective-C 应用程序 18 年中,我认为我只遇到过几次错误的集合类问题。在所有情况下,它都表明存在总体设计问题,而不是程序错误。

简而言之,您的应用程序控制集合的内容,除非您在集合中粘贴错误的内容,否则您的集合将包含您所期望的内容。在编写良好的应用程序中,可能向集合添加内容的位置数量应该非常少,通常只有一两个位置。

如果您确实觉得需要对此进行防御,NSAssert([... isKindOfClass:...])请在向数组添加内容的一两个位置添加一个。无需在检索点添加相同的内容。

但是,存在一种常见的误报故障模式,该模式似乎是集合中的错误类型。如果你过度释放一个对象,而另一个类的对象恰好被分配在同一个位置,那么你会看到这种模式的失败。

于 2012-08-02T13:56:14.357 回答