目标C中未找到的方法

时间:2015-03-04 16:12:10

标签: ios objective-c

我正在尝试在objectiveC中创建一个全局函数或方法。这样我就可以从任何一个视图控制器中调用它。

我已经查看了这篇文章:How to create global functions in Objective-C

所以我做的是在Xcode 6中我创建了新文件并选择了一个类别下拉列表。创造了这两个* .h& * .m文件给我。我在其中添加了名为SaveWeatherDataNow的方法

//NSObject+SaveWeatherData.h
#import <Foundation/Foundation.h>

@interface NSObject (SaveWeatherData)

+(void)SaveWeatherDataNow:(NSString *)XML;

@end

//NSObject+SaveWeatherData.m
#import "NSObject+SaveWeatherData.h"

@implementation NSObject (SaveWeatherData)

+(void)SaveWeatherDataNow:(NSString *)XML
{

    NSLog(@"SaveWeatherDataNow XML lenght: %ld", [XML length]);
}

@end

现在在我的另一个视图控制器中,如果我调用此方法,则编译器根本找不到它。我错过了什么?

//  v1CitiesAdd.m
#import "NSObject+SaveWeatherData.h"

@implementation v1CitiesAdd
...
...
-(IBAction) doneAction
{

...
[SaveWeatherData SaveWeatherDataNow:XML]; // Complier Error: Use of undeclared identifier SaveWeatherData

3 个答案:

答案 0 :(得分:2)

+更改为-(void)前面):

-(void)SaveWeatherDataNow:(NSString *)XML;

这样,您可以在SaveWeatherData对象中引用该方法。

不要忘记在标题(.h)文件和类(.m)文件中更改它。

您也可以致电

[NSObject SaveWeatherDataNow:XML];

留下+。

===

使用+时,它是一种类方法。它在全球范围内运作,并且不了解或关心单个对象。

使用 - 时,它是一种对象方法。它适用于特定对象。

所以,如果有一个Brick类,

+(虚空)粉碎;

会更改/更新每个要粉碎的砖块。

- (void)破碎;

会破坏您发送该邮件的特定砖块。

[myBrick1 shatter];只会破坏一块砖。

[Brick smash];所有砖块都会改变全局。

答案 1 :(得分:2)

我正在写一个不同的答案,因为我认为这个问题的最佳答案是不要这样做!

NSObject创建一个类别以保存数据是一件非常难看的事情。

<强> WHY

这意味着当你将它导入一个类时,继承自NSObject(几乎所有这些)的类会突然有这个额外的方法。

例如,像这样的代码可以工作:

NSNumber *myInt = @(3)
NSString *myXmlAsString = [NSString stringWithFormat:@"<rating>%@</rating>",myInt.integerValue];

如果你继续使用静态方法(用+),你可以这样做:

[NSObject SaveWeatherDataNow:myXmlAsString];

[NSNumber SaveWeatherDataNow:myXmlAsString];

甚至

[UIImage SaveWeatherDataNow:myXmlAsString];

如果将其更改为实例方法(使用 - ),则可以执行以下操作:

[myXmlAsString SaveWeatherDataNow:myXmlAsString];

[myInt SaveWeatherDataNow:myXmlAsString];

或使用该范围内的大多数现有变量,至少可以说是非常奇怪。

你应该做什么

我会使用以下两个选项之一:

  1. 创建一个管理数据保存/加载的类。用法应如下所示:

    [DataManager saveWeatherDataNow:myXmlAsString];

  2. 如果你不需要那么多,只需要那个函数,你可以创建一个Utility类并添加那个静态方法(如果你还没有它)。

    [Utility saveWeatherDataNow:myXmlAsString];

  3. PS:按照惯例,您通常使用小写启动方法名称。

答案 2 :(得分:0)

  

[SaveWeatherData SaveWeatherDataNow:XML]; // Complier Error: Use of undeclared identifier SaveWeatherData

问题的根源在于您还没有定义名为SaveWeatherData的类。相反,您已在NSObject上创建了一个类别,以便您可以在+SaveWeatherDataNow:派生的任何类别上调用NSObject。直接的解决方案是创建一个类而不是类。改变这些行:

@interface NSObject (SaveWeatherData)
@implementation NSObject (SaveWeatherData)

到这些:

@interface SaveWeatherData
@implementation SaveWeatherData

这应该允许这样的调用:

[SaveWeatherData SaveWeatherDataNow:XML];

正常工作。