繁体   English   中英

用整个应用程序使用的方法编写类的正确方法是什么

[英]What's the correct way to write a class with methods used by the whole app

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

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

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];来访问共享实例[[FileParser sharedParser] parseSomething:something]; 应用程序中的任何位置。

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

您可以创建一个单例对象。 仅创建对象的一个​​实例的地方。 将更多内容作为设计模式看做单例对象。

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

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

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

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

@interface MONStatelessFileParser

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

@end

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

@interface MONFileParserWithState

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

- (MONResource *)openResource;

@end

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

如果您希望某个类(A)包含可在视图/视图控制器等中使用的fileparse方法,则可以通过在应用程序委托中添加A,在其中实例化A并在应用程序委托引用中重用A实例来实现。 。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM