![](/img/trans.png)
[英]What's the correct way to store `Class` object into `NSMutableArray`?
[英]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.