iphone - self 是一个指针吗?

标签 iphone objective-c cocoa cocoa-touch

self 是个什么样的东西?称它为指针是否正确?或者它是一个变量?或者还有什么?

最佳答案

Objective-C 方法实现实际上只是一个带有两个额外参数的 C 函数。第一个参数是 self 变量,第二个参数是用于调用实现的选择器。第三个和任何后续参数(如果有的话)是您的方法的实际参数。如果您有这样的方法:

@implementation MyClass

- (int) myMethod:(int) anArg
{
    NSLog (@"The selector %@ was used.", NSStringFromSelector(_cmd));
    return [self someValue] + anArg;
}

@end

那么,大致相当于这样:

// Implementation of MyClass's instance method "myMethod"
int MyClass_myMethod (id self, SEL _cmd, int anArg)
{
    NSLog (@"The selector %@ was used.", NSStringFromSelector(_cmd));
    return [self someValue] + anArg;
}

不过请记住,调用 C 函数和发送消息是非常不同的。向对象发送消息将导致调用实现,而该实现由运行时决定。由于方法实现是在运行时确定的,编译器不能简单地将所有消息发送与直接函数调用交换。我相信有一些方法可以告诉运行时更改用于给定类的给定选择器的方法实现。

运行时根据self 的类决定使用哪个实现。如果 selfnil,则消息发送是空操作,因此,所有方法实现都将始终具有 self 的有效值它们由运行时调用。

关于iphone - self 是一个指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883973/

相关文章:

ios - 如果我无法访问正在编写代码的计算机,我(设计人员)如何在开发中测试和使用 iPhone?

iphone - 导航回 View 时 UIWebView 变为空白

ios - NSURLConnection - 禁用身份验证质询响应机制

ios - 注册远程通知在 Xcode 6 中不起作用

cocoa - Apple 如何使 info.plist 显示其 "Information Property List"?

iphone - 更改 Cocoahttpserver 中的下载文件名

iphone - 在有限的边界内拖动 View 而不超出该边界

iphone - NSOperationQueue 和并发与非并发

objective-c - IBAction 中属性(property)失去值(value)

ios - 编译框架在归档时提供位码错误