obj-c原生没有提供此项机制,不像java有private/protected/public方法的概念。obj-c中的@private以及类似的@protected和@public是用于修饰类的实例变量的而不能修饰方法。
正如obj-c没有类变量可以通过定义static静态变量来解决一样,obj-c中类的私有实例方法也是可以通过分类来模拟的。我们可以将分类定义从类的头文件中转移到类的实现文件中来实现:
foo.h
#import <Foundation/Foundation.h>
@interface Foo:NSObject
-(int)do_calc:(int)x;
@end
foo.m
#import "foo.h"
@interface Foo (Calc)
-(int)calc:(int)x;
@end
@implementation Foo (Calc)
-(int)calc:(int)x{
return x*x*x;
}
@end
@implementation Foo
-(int)do_calc:(int)x{
return [self calc:x];
}
@end
main.m
#import "foo.h"
int main(void){
@autoreleasepool{
Foo *f = [Foo new];
NSLog(@"calc 11 is %d",[f do_calc:11]);
//下面一行代码编译会出错
//NSLog(@"direct invoke calc 11 is %d",[f calc:11]);
}
return 0;
}
程序运行结果:
2015-05-28 05:35:51.924 main[927:21996] calc 11 is 1331
如果将直接调用calc那行代码去掉注释则编译报错如下:
main.m:8:43: error: no visible @interface for 'Foo' declares the selector 'calc:'
NSLog(@"direct invoke calc 11 is %d",[f calc:11]);
~ ^~~~
1 error generated.