2

我正在开发一个有多个视图的应用程序。所有这些视图及其视图控制器都使用相同的方法(它是一个文件解析器)。因此,为了避免重复,我考虑只使用文件解析方法创建一个新类。但现在我不确定如何以正确的方式做到这一点。我应该选择哪个班级?它是 Cocoa 类的子类吗?我想我只是在使用 Foundation 框架的方法。

还是我完全错了,它是一个模块?

4

4 回答 4

2

iPhone SDK 的一个常用模式是使用共享单例实例,您可以在[NSNotificationCenter defaultCenter]或中查看此示例[NSUserDefaults standardUserDefaults]

您可以通过向您的类添加静态方法来实现这样的模式:

// FileParser.h
+ (FileParser*)sharedParser;

// FileParser.m
+ (FileParser*)sharedParser {
    static FileParser* kSharedParser = nil;
    if(kSharedParser == nil) kSharedParser = [[FileParser alloc] init]; 
    // Note the over-retained object, this is by design. You should never release this object.
    // it will be destroyed when your application is killed.
    return kSharedParser;
}

然后,您可以通过在应用程序中的任何位置导入FileParser.h和写入来访问您的共享实例。[[FileParser sharedParser] parseSomething:something];

PS:这不是线程安全的,如有必要,请阅读 iOS 上的线程同步。

于 2012-05-08T20:47:20.947 回答
1

您可以创建一个单例对象。只有一个对象的实例被创建。更多地将单例对象视为一种设计模式。

您也可以只拥有一个类并且只为该类编写类方法(+)。仅当您不必在类中存储任何实例变量,或者这些实例被声明为静态时,这才有效。

我认为单例对象将是最好的方法。尽管它在哲学上与上面 ant 的答案非常相似,因为它只会生成 FileParser 对象的一个​​实例。

于 2012-05-08T20:42:47.217 回答
1

这只是归结为“我如何重用实现?”,这是一个应该熟悉的问题。

如果不需要状态(例如 ivars),您可以使用这种方法。另请注意,这可能会使用多态性:

@interface MONStatelessFileParser

+ (MONResource *)resourceAtURL:(NSURL *)pURL;

@end

如果需要状态(例如 ivars),您可以使用这种方法,然后在需要时保留实例。多态性也适用:

@interface MONFileParserWithState

@property (nonatomic, copy, readwrite) NSString * elProperty;

- (MONResource *)openResource;

@end

如果您没有多种读取文件的方式(类似于 NSDocument)并且不需要多种策略来打开文件,则可以避免多态性。

于 2012-05-09T01:17:11.647 回答
0

如果您希望某个类(A)包含可用于跨视图/视图控制器等的文件解析方法,您可以通过将 A 添加到应用程序委托来实现,在其中实例化 A 并通过应用程序委托引用重用 A 实例.

这样您就不必在每个视图/视图控制器等中实例化 A。

于 2012-05-08T20:37:37.217 回答