Iphone 如何在Objective-C中设置非实例化类(仅包含方法的类)

Iphone 如何在Objective-C中设置非实例化类(仅包含方法的类),iphone,objective-c,ios,class,Iphone,Objective C,Ios,Class,我希望在Objective-C中为一个iOS项目创建一个类,该项目的重点是获取数据。我熟悉类的正常工作方式,setter和getter方法和变量。但是,对于这个类,因为它只执行一个函数(返回NSMutableArrays),所以我不想创建一个类的实例来使用类中的方法 你知道我怎样才能干净利落、高效地完成这项工作吗?你想创建类方法吗 @interface Foo : NSObject {} +(NSMutableArray*)someClassMethod:(id)params; @end ..

我希望在Objective-C中为一个iOS项目创建一个类,该项目的重点是获取数据。我熟悉类的正常工作方式,setter和getter方法和变量。但是,对于这个类,因为它只执行一个函数(返回NSMutableArrays),所以我不想创建一个类的实例来使用类中的方法


你知道我怎样才能干净利落、高效地完成这项工作吗?

你想创建类方法吗

@interface Foo : NSObject {}
+(NSMutableArray*)someClassMethod:(id)params;
@end

...

@implementation Foo
+(NSMutableArray*)someClassMethod:(id)params {
   // whatever implementation 
   return nil;
}
@end

...

NSMutableArray* array = [Foo someClassMethod:nil];

如果您只执行函数,而不需要支持子类化等,为什么不将它们作为C函数而不是带有方法的类来编写呢?

如果这只是一个执行某些函数的类,您可以将其作为C函数来编写

在头文件中--

在您的实现文件中--

在类中包含需要这些函数的.h文件,并直接调用它们

NSMutableArray *anArray = functionThatReturnsMutableArray(param1, param2);

这在Objective-C中有点不典型。因为Objective-C中的类实际上不能具有超出普通函数可用的状态(即没有类变量),所以在大多数情况下,从未实例化的类相对来说是无用的。此类功能的正常设计模式为:

  • 一个单例类(如果你需要很多状态)

  • 一组函数(如果没有)


根据您正在执行的操作(相同的NSString操作、UIView操作等),您可以实现一个类别(我的回答是下面的解释——为了方便起见复制;)

类别使用其他方法或现有方法的版本扩展现有类。例如,假设您想添加一个方法,将字符串的第一个字母返回给NSString。为此,您将创建一个类别,如下所示:

接口-JULString.h

#import NSString

@interface NSString (JULString)

-(NSString *) firstLetter;

@end
实现-典型的约定是类别的文件名是要扩展的类的名称,后跟“+”和类别的名称。在这种情况下,该文件将被称为NSString+JULString.m

#import "NSString+JULString.h"

@implementation NSString ( JULString )

- (NSString *)firstLetter
{
  return [NSString stringWithFormat:@"%C", [self characterAtIndex:1]];
}
@end
关于categories,最巧妙的一点是,现在它们扩展了您正在使用的类的任何实例的行为。换句话说,应用程序中的任何NSString都将有新方法(当然前提是您导入了正确的头文件)。但要小心,因为权力越大,责任越大。使用类别行为覆盖类可能会导致不期望的效果,所以要小心

您可能需要检查的几个链接是:

注:
我没有带Mac电脑,所以我写这段代码基本上是在我的脑子里(并使用上面网站的一些代码作为提醒)。因此,我为任何错误提前道歉;)

@Matthew Frederick:你在说什么?KennyTM在这里编写的类只包含类方法。你不需要实例化它,事实上创建一个实例是没有意义的。当你给全班同学发信息时,你在和什么东西说话——全班同学。@Chuck,很明显,我在胡言乱语,在喝咖啡之前不应该回答这样的问题——没有注意到他使用了课堂方法,这可能会让我进到胡言乱语的领域。这已经超过5分钟了,所以我无法编辑它,所以我将添加一条新的注释,其中正确的部分将很快删除其他注释,以避免将来的混淆(并避免自己在完全清醒前的尴尬)。感谢您的关注。我将为@mac_55添加一个类,它不需要属性或实例变量,也不需要getter和setter。@Chuck这一直困扰着我,所以我试图弄清楚我的大脑在做什么。我想要传达的是,为了调用类的方法,必须有一个实例化的对象来实现该方法,以便调用它。“这有什么问题吗?”马修·弗雷德里克:在我看来,当你谈论类方法时,这有点误导。类是一个实例化的对象,但它只是由于在程序中而自动实例化的。您不必自己实例化任何东西。
#import NSString

@interface NSString (JULString)

-(NSString *) firstLetter;

@end
#import "NSString+JULString.h"

@implementation NSString ( JULString )

- (NSString *)firstLetter
{
  return [NSString stringWithFormat:@"%C", [self characterAtIndex:1]];
}
@end