我是一名学习目标C的C / Perl / Unix人员。我有一个简单的OS X应用程序,我创建了两个类。如何从另一个类中的方法调用一个类的方法?
到目前为止,我写了简单的"概念证明"应用程序,在单个类中创建实例方法,以及简单的main.m:
MyClass.m
#import "MyClass.h"
@implementation MyClass
- (NSString *) methodName {
...some code here...
}
的main.m
#import "MyClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *myClass = [[MyClass alloc] init];
NSString *page;
page = [myClass methodName];
我从main.m初始化类,它作为一个简单的测试平台。这对学习如何编写简单的类和方法很好。
现在我已经创建了两个类,第二个是我想要在第一个类中进行解析的字符串方法的集合。这些方法返回子字符串,如果给定字符串中存在子字符串,则返回TRUE / FALSE。
如何从另一个类中调用这些子字符串方法?我需要使用类方法吗?我是否需要将初始化从main.m移动到每个类以允许看到类?
正如我所提到的,我是一名C程序员,但是实例/类方法和类的范围对我来说仍然是新的...任何建议或指向文档的指针(Apple或第三方)都是受欢迎的。
答案 0 :(得分:1)
在面向对象的编程中,类将数据和代码组合在一起。它就像一个也有方法的结构。
如果方法不依赖于对象的状态,则它可以是类方法。在这种情况下,您只是将该类用作该方法可以存在的一种命名空间。如果所有方法都是类方法,则永远不需要实例化类。 (即你不需要[[StringHelpers alloc] init]
)。
那么......你的第二堂课有数据吗?
如果没有,只需制作方法类方法即可。然后你可以这样做:
#import <StringHelpers.h>
[StringHelpers hasSubstring:myOtherString];
答案 1 :(得分:0)
假设您的新类名为StringUtility,您可以执行以下操作:
将StringUtility类中的方法声明为&#39;类方法&#39;。这意味着您向类本身发送消息,而不是类的特定实例。为此,只需在+
和-
的方法声明开头使用StringUtility.h
而不是StringUtility.m
定义这些方法。然后你可以这样调用这些方法:
+ (NSString *) awesomeTransformationForString:(NSString *)aString
{
NSString * newString = ... // code for your transformation that does something to aString here.
return newString
}
然后,实际使用类方法:
NSString * myString = @"My string for awesomeifying.";
NSString * transformedString = [StringUtility awesomeTransformationForString:mystring];
如果StringUtility类中的方法需要使用它们在调用它们之间存储的信息,为了确定如何对传递它们的对象进行操作,那么它们需要是&#39;实例方法&#39 ;.这意味着您创建该类的实例并与之通信:
- (NSString *) awesomeTransformationForString:(NSString *)aString
{
NSString * newString = ... // code for your transformation that does something to aString here.
return newString
}
然后实际使用实例方法:
NSString * myString = @"My string for awesomeifying.";
StringUtility * myStringUtility = [StringUtility new];
NSString * transformedString = [myStringUtility awesomeTransformationForString:mystring];
请注意,没有什么可以阻止您的类包含类方法和实例方法。您只需向类消息传递类方法,并为实例方法传递实例。有时,您可能希望在实例中向对象自己的类发送类方法。只需像在其他任何地方一样使用[StingUtility methodName]
。