use*_*291 5 xcode cocoa objective-c
这是一个初学者的问题所以请耐心等待.
我有一个使用第三方库的课程(oniguruma,如果重要的话).我希望库方法完全由我自己修饰,这样我就可以随时切换我的类的底层实现.就像是:
// MyClass.h
@interface MyClass : NSObject ...
- (int) doSomething;
// MyClass.m
#import "some_library.h"
@implementation MyClass
- (int) doSomething
{
//call library's specific stuff
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这么好,但现在我需要在MyClass中使用一个具有一些库定义类型的实例变量(在"some_library.h"中声明的结构).当然我可以直接在界面部分导入库:
//MyClass.h
#import "some_library.h"
@interface MyClass : NSObject {
some_library_t blah;
}
- (int) doSomething;
@end
Run Code Online (Sandbox Code Playgroud)
但这正是我想要避免的 - 让MyClass的用户知道它的实现细节.
我可以以某种方式"隐藏"我的类界面中特定于库的类型吗?什么是标准做法?
标准做法是使用对库类型或自定义实现结构的不透明指针(因此它也称为Pimpl - 指向实现的指针).
要做到这一点,你必须知道你可以定义指向不完整类型的指针,即你只声明存在的类型.例如:
struct FooImpl;
@interface Foo {
struct FooImpl* impl; // using pointer is ok for incomplete types
}
@end
Run Code Online (Sandbox Code Playgroud)
然后,您可以在实现文件中定义类型:
struct FooImpl {
// ... member definition
};
Run Code Online (Sandbox Code Playgroud)
并在您的-(id)init方法中分配/初始化它.
FooImpl也可能是SomeLibraryType因为库类型是一个结构 - 然后你以相同的方式转发声明它并在源文件中包含库头,它为你提供了结构定义.
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |