2009-06-06 21 views
0

我想我在这里错过了一些非常基本的东西。我有一个实用工具类,它有一些从几个不同的类中调用的函数。我想能够包含Utilities.h并且只是说[Utilities doStuff]并且在Utilities.m中执行doStuff函数,那么执行此操作最简单的方法是什么?可可实用类

+0

我试过使用+类方法的方式,但现在我得到NSInvocation:警告:类'Utilities'的对象0x7480没有实现methodSignatureForSelector – bmalicoat 2009-06-06 03:09:45

回答

5

最简单的方法是不要让Utilities成为一个类,除非有某些原因需要创建它的实例。由于本质上你的效用函数是一个没有共同主题的松散集合,所以没有理由试图强制一个面向对象的范例。 (与Java不同,在C语言中,并非每件事都必须在一个类中)。只需将它们定义为传统的C风格函数,并将它们称为它们。如果你真的想在不是对象的东西上使用括号表示,并且不属于任何应该是类的东西,那么你可以像其他人所建议的那样使用+表示法。

+0

我同意先生未知(谷歌)。函数是语言的一部分。如果这是您想要的功能,那么使用它们并没有什么错或可耻的。 – Chuck 2009-06-06 03:20:51

1

使用#import "Utilities.h导入使用公用程序类的.m文件中的标题。之后,你可以自由使用它的任何方法。请记住,如果你想调用类的方法(而不是创建一个Utilities对象的实例并调用该方法),则需要将其声明为类方法。为此,请使用+号而不是减号,例如+ (void)doStuff:(NSString *)aString;

如果上面的例子令人困惑,苹果有一些很好的解释面向对象编程的文档。

0

这可以用一个静态方法中的公用设施类来实现:

@interface公用事业

+(int)的doStuff;

@end

+号使得该方法静态的,而不是 - ,这是一个实例方法。

+0

Objective-C的术语是“class method”。 – 2009-06-06 04:31:25

4

您需要的其他语言的Utility-classes的东西通常在Objective-C中更好地实现为Categories。这是添加到类而不创建子类。

而不是有一个StringUtitities类,你会为NSString类创建StringUtilities类别。这当然不是每一种情况都是如此,但对于许多实用工具类来说却是如此。

它在http://macdevelopertips.com/objective-c/objective-c-categories.html

2

中更详细地描述user57368同意,它的实现可能是显而易见的大多数,但不是很明显我,所以我虽然我会创建一个例子来说明可可/ Xcode的细节:

您需要创建两个文件Utilities.h和Utilities.m

//Utilities.h 
#if TARGET_OS_IPHONE 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#elif TARGET_OS_MAC 
    #import <Cocoa/Cocoa.h> 
#endif 

float randomfloatBetween(float min, float max); 

//Utilities.m 
#import "Utilities.h" 

float randomfloatBetween(float min, float max) 
{ 
    float range= max-min; 
    float maxRandom = pow(2,31)-1; 
    srandom((int)[NSDate date]); 
    return random()/maxRandom*range + min; 
} 

,你想用你声明的函数然后,只需使用#import“Utilities.h”任何来源。

Utilities.m需要添加到应用程序目标下的编译源代码(Xcode通常会为你做这件事)。