2010-03-20 35 views
5

tôi đã được đọc lên về bỏ qua tin nhắn Objective-C để đạt được hiệu suất (không liên quan đến câu hỏi cụ thể này) khi tôi tìm thấy một chút thú vị mã:Phạm vi của hàm c được xác định trong lớp mục tiêu-c là gì?

#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 

Câu hỏi của tôi là; khi sử dụng hàm c, trong một đối tượng object-c, phạm vi nào là hàm c (cFibIMP trong trường hợp cụ thể này) được đặt trong? Liệu lớp target-c có đóng gói hàm c loại bỏ sự thay đổi của xung đột tên hay hàm c chỉ đơn giản là được đưa vào phạm vi toàn cục của toàn bộ chương trình mục tiêu-c?

Trả lời

4

Các chức năng được bán phá giá trong phạm vi "toàn cầu".

Bạn có thể kiểm tra điều này bằng cách thêm một lớp mới vào cuối của mã mẫu của bạn:

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

C chức năng có phạm vi toàn cầu.

Nếu bạn muốn có thứ gì đó như phạm vi "lớp", đặt cược tốt nhất của bạn có thể là sử dụng từ khóa static, giới hạn phạm vi chức năng cho tệp nguồn chứa trong đó. Đối với loại sử dụng bạn đang minh họa ở đây, điều đó thường đủ gần.

+0

vì vậy việc thêm tiền tĩnh vào khai báo hàm sẽ hạn chế phạm vi của nó đối với mô đun đó? Điều này có áp dụng ngay cả khi khai báo tĩnh được thực hiện nội bộ cho @implementation như trái ngược với việc được thực hiện bên ngoài (tức là ở đầu tệp mã nguồn không?) –

Các vấn đề liên quan