开发者

How to create global functions in Objective-C

I'm developing an iphone app and I need to have some functions to use globally in my classes.

But how can I do this?

I just tried to create functions.h likes this

#include <Foundation/Foundation.h>

- (void)printTest;

and in the functions.m

#import "functions.h"

- (void)prinTest {
    NSL开发者_JAVA百科og(@"test");
}

but it doesn't work. Says me: "Method definition not in a @implementation context".


First note that Objective-C language is a superset of C language (meaning there is absolutely nothing wrong with mixing them).

There are two approaches.

#1 Real global function:

Declare a global C-style function, which can have ObjC logic (in definetion instead of just C-style logic).

Header:

void GSPrintTest();

Implementation:

#import "functions.h"

#import <Foundation/Foundation.h>

void GSPrintTest() {
  NSLog(@"test");
}

Call using:

#import "functions.h"
...
GSPrintTest();

A third (bad, but possible) option would be adding a category to NSObject for your methods:

Header:

#import <Foundation/Foundation.h>

@interface NSObject(GlobalStuff)
- (void) printTest;
@end

Implementation:

#import "functions.h"

@implementation NSObject(GlobalStuff)
- (void) printTest {
  NSLog(@"test");
}
@end

Call using:

#import "functions.h"
...
[self printTest];

#2 class method:

Create a class method with + sign, in helper class (instead of instance method with - sign).

Header:

#import <Foundation/Foundation.h>

@interface GlobalStuff : NSObject {}

+ (void)printTest;

@end

Implementation:

#import "functions.h"

@implementation GlobalStuff

+ (void) printTest {
  NSLog(@"test");
}

@end

Call using:

#import "functions.h"

...
[GlobalStuff printTest];


When you want a global function, just write a regular C function. The Objective-C syntax is meant to be used solely in the context of object methods.

void printTest() {
    NSLog(@"This is a test");
}

You also have to add the declaration in the functions.h header:

void printTest();


Simple. Your setup is almost perfect.

Just #include your Functions.h in all classes that need it, and you should be all set. I do it all the time.

You will have to use some kind of object, but you can make it "feel" just like a global objective-c function by using a category of NSObject:

  • Create a new file and choose Objective C Category.
  • Make it a category of NSObject.
  • Use the templates provided to define and implement your methods.

Now you can use them simply by invoking

[self myCategoryMethod:optionalParameter];


Try to rename functions.m into functions.c.

Or add this methods into some class SharedClass and decline them as static : + (void)prinTest. Then you can access them using this code

[SharedClass printTest];


What your error is referring to is you need to have that method in an interface.

@interface SomeClass
- (void)printTest;
@end

To use a static void throughout your app (where you have included your Functions.h), try the following:

void printTest ()
{
    /* do your print stuff */
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜