我正在尝试在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
答案 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];
或使用该范围内的大多数现有变量,至少可以说是非常奇怪。
你应该做什么
我会使用以下两个选项之一:
创建一个管理数据保存/加载的类。用法应如下所示:
[DataManager saveWeatherDataNow:myXmlAsString];
如果你不需要那么多,只需要那个函数,你可以创建一个Utility类并添加那个静态方法(如果你还没有它)。
[Utility saveWeatherDataNow:myXmlAsString];
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];
正常工作。