【发布时间】:2012-05-06 13:22:25
【问题描述】:
我创建了两个具有相同名称的方法的类。其中一个是私人的,另一个是公共的。 然后在代码的某个地方我写了这个:
-(void) doMagic:(id) object {
[(ClassA*)object doSmth];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
ClassB * objB = [[ClassB alloc] init];
[self doMagic:objB];
}
在控制台我看到这个: 2012-04-25 23:41:28.183 testmagic[558:403] classB - doSmth
这里是课程的来源:
//.h
@interface ClassA : NSObject
-(void) doSmth;
@end
//.m
@implementation ClassA
-(void)doSmth {
NSLog(@"classA - doSmth");
}
@end
//.h
@interface ClassB : NSObject
@end
//.m
@interface ClassB ()
-(void) doSmth;
@end;
@implementation ClassB
- (void)doSmth {
NSLog(@"classB - doSmth");
}
@end
我知道,这是因为 Obj-C 中方法的“消息”性质,并且在运行时类可能不知道它的哪些方法是私有的或公共的,但问题是:
我怎样才能制作真正私有的方法?我听说通过反编译可以看到方法名称,所以有人可以使用我的私有 API。如何预防?
【问题讨论】:
-
没有办法创建一个真正的私有方法。如果您的对象响应消息,那么它就会响应。请参阅:stackoverflow.com/questions/172598/… 和 stackoverflow.com/questions/2158660/…
-
所以我应该如何检查,该消息是从这个对象发送的?也许我应该在使用方法之前创建一些布尔变量并将其设置为 YES?我又发现了一件事。您还可以成为 keypath 的观察者,其中 key path 是一些私有属性。这是令人惊叹的不安全语言。但无论如何,很酷。
标签: objective-c private encapsulation