3

我对自指针有点困惑。我知道如果我想在目标 C 中使用 self ,我需要将它作为参数传递,例如

someFunction(id self)
{

}

然而,我有点困惑的是,如果我想使用 self 的成员变量,我会收到以下错误

在“__strong id”类型的对象上找不到属性“浏览器”。

我在头文件中将浏览器定义为:

@property webBrowser* browser;

然后我试图在我的 c++ 函数中调用我的 webBrowser 类的函数:

[self.browser StartSearch:self];

错误发生在上面的行中。如果我改为将 self 的成员变量作为参数传递,则该函数肯定会被正确调用。不过,这感觉相当hacky。

关于它为什么不起作用以及替代方案是什么的任何解释都会很棒。

4

2 回答 2

3

为了使用带点的属性语法,您需要为编译器提供确切的类型,例如通过将id指针转换为您的类的类型。如果您不想使用确切的类型或强制转换,请使用方法调用语法:

[[self browser] StartSearch:self];
于 2013-05-20T10:12:43.997 回答
2

您可以简单地指定参数类型而不是使用泛型id

void someFunction(MONObject * self) {
    [self.browser StartSearch:self];
}

或者如果你觉得你真的,真的,真的需要类型擦除(例如用于编译防火墙),你可以考虑这样重写它:

// Some.mm
void someFunction(id self) {
    MONObject * object(self);
    [object.browser StartSearch:self];
}
于 2013-05-20T10:12:13.207 回答