2010-03-20 1 views
5

Ich lese bis zu Objective-C Messaging-Umgehung Leistung (irrelevant für diese spezifische Frage) zu gewinnen, wenn ich ein interessantes Stück Code gefunden:Was ist der Umfang einer c-Funktion innerhalb der objective-c-Klasse definiert?

#import <Cocoa/Cocoa.h> 

@interface Fib : NSObject { } 

- (long long) cFib: (NSUInteger) number; 

@end 

@implementation Fib 

// c implementation of fib 
long long cFibIMP(NSUInteger number) 
{ 
    return (number < 3) ? 1 : cFib(number - 1) + cFib(number - 2); 
} 

// method wrapper for c implementation of fib 
- (long long) cFib: (NSUInteger) number 
{ 
    return cFibIMP(number); 
} 

@end 

Meine Frage ist; Wird bei Verwendung von c function innerhalb eines Objekts "objective-c" in welchen Bereich die c-Funktion (cFibIMP in diesem speziellen Fall) eingefügt? Verkapselt die objective-c-Klasse die c-Funktion, die die Änderung von name-clash entfernt, oder wird die c-Funktion einfach in den globalen Bereich des gesamten Ziel-c-Programms geworfen?

Antwort

4

Die Funktionen werden im Bereich "global" ausgegeben.

Sie können dies überprüfen, indem Sie eine neue Klasse am Ende Ihres Beispielcode hinzu:

@interface Gib : NSObject {} 
@end 
@implementation Gib 
- (void) t 
{ 
    NSLog(@"%d", cFibIMP(10)); 
} 
@end 
1

Die C-Funktion globale Reichweite hat.

Wenn Sie etwas wie "Klasse" haben möchten, ist es wahrscheinlich am besten, das Schlüsselwort static zu verwenden, das den Umfang der Funktion auf die Quelldatei beschränkt, in der es enthalten ist. Für die Art der Verwendung, die Sie hier illustrieren, ist das normalerweise nah genug.

+0

also vor der statischen Deklaration der Funktion Deklaration würde es den Umfang auf das Modul dann einschränken? Trifft dies zu, obwohl diese statische Deklaration innerhalb der @ Implementierung vorgenommen wird und nicht im Freien (d. H. Am Anfang der Quellcodedatei)? –