objective-c - Objective-C 中的私有(private)方法不是私有(private)的

标签 objective-c private encapsulation

我创建了两个具有相同名称的方法的类。在其中一个中它是私有(private)的,在另一个中是公共(public)的。 然后我在代码的某个地方写了这个:

-(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] B 类 - 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 中方法的“消息”性质,并且在运行时类可能不知道它的哪些方法是私有(private)的还是公共(public)的,但问题是:

我怎样才能制作真正私有(private)的方法?我听说通过反编译可以看到方法名称,所以有人可以使用我的私有(private) API。我该如何预防?

最佳答案

运行时无法调用它永远不知道的东西。我通常采用的方法是使用静态函数:

MONObject.h

@interface MONObject : NSObject
// ...
@end

MONObject.m

// 'private' methods and ivars are also visible here
@interface MONObject()
// ...
@end

// typically here:
static void fn(MONObject * const self) {
    NSLog(@"%@", [self description]);
}

@implementation MONObject
// ...

// sometimes here:
static void fn2(MONObject * const self) {
    NSLog(@"%@", [self description]);
}

@end

关于objective-c - Objective-C 中的私有(private)方法不是私有(private)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10322772/

相关文章:

ios - 从 iPhone 4 到 iPhone 5 屏幕尺寸兼容性问题

iphone - UITableView 无限滚动

Firefox 8 隐私浏览中的 Javascript 加速?

ios - (550 5.1.1 Relay not allowed APPLE)我无法从 gmail 地址向私有(private)苹果地址发送电子邮件

ios - 有没有办法允许某些类访问某些其他类的私有(private)属性?

python - 将flask api封装在类中以供测试

iPhone cocoa "error:request for member ____ in something not a structure or union"

ios - 每次重新加载表格时图像闪烁(iOS,objective-C)

java - 字节码——公共(public)属性和私有(private)属性的区别

c++ - 如何重新设计/修复此程序以允许封装?