objective-c - 是否可以有 "implementation-only"类(class)成员?

标签 objective-c cocoa xcode

这是一个初学者问题,所以请多多包涵。

我有一个使用第三方库(oniguruma,如果重要的话)的类。我希望库方法完全由我自己装饰,这样我就可以随时切换我的类的底层实现。像这样的东西:

// MyClass.h

@interface MyClass : NSObject ...

- (int) doSomething;


// MyClass.m

#import "some_library.h"

@implementation MyClass

- (int) doSomething 
{
   //call library's specific stuff
}

到目前为止一切顺利,但现在我需要在 MyClass 中使用一个实例变量,它具有一些库定义的类型(在“some_library.h”中声明的结构)。当然,我可以直接在界面部分导入库:

//MyClass.h

#import "some_library.h"

@interface MyClass : NSObject {
    some_library_t blah;
}
- (int) doSomething;
@end

但这正是我想要避免的——让 MyClass 的用户知道它的实现细节。

我能否以某种方式从类的界面中“隐藏”特定于库的类型?标准做法是什么?

最佳答案

标准做法是使用 opaque pointers库类型或自定义实现结构(因此它也称为Pimpl - 实现指针)。

要做到这一点,您必须知道您可以定义指向不完整类型的指针,即您只声明存在的类型。例如:

struct FooImpl;

@interface Foo {
    struct FooImpl* impl; // using pointer is ok for incomplete types
}        
@end

然后您可以在实现文件中定义类型:

struct FooImpl {
    // ... member definition
};

并分配/初始化它,例如在你的 -(id)init 方法中。

FooImpl 也可以是 SomeLibraryType 如果库类型是一个结构 - 然后你会以同样的方式转发声明它并在源文件中包含库头,它为您提供了结构定义。

关于objective-c - 是否可以有 "implementation-only"类(class)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2355758/

相关文章:

swift - 将 CGImageRef 保存到 png 文件?

objective-c - 如何从 parse.com 检索图像

cocoa 警告: NSWindow does not support utility styleMask 0x10

ios - 关闭 Modal Segue 后更新 UIViewController

objective-c - 核心数据 - 获取具有可选属性的对象

ios - 键盘在出现时隐藏 UITextView

cocoa - 如何测试应用程序是否正确处理慢速/不稳定的文件系统?

cocoa - 从包含该文件的目录之一为该文件创建安全范围书签

xcode - viewDidLoad() 之后出现意外的打印对话框

xcode - EKEvent 上次更新时间