iOS类方法

iOS类方法,ios,objective-c,runtime,Ios,Objective C,Runtime,日志: 名称: 我的理解是vid是指向TestObj类对象地址的指针,那么为什么vid可以直接发送到testName实例方法 另外,为什么testName方法调用NSLog将输出而不是nil 谢谢。我认为你基本上是幸运的,因为你没有因为代码而崩溃 首先,类方法以+开始,而不是-——因此这是您正在实现的实例方法 name: <ViewController: 0x7ff3584b6580> 您不希望获取指向类对象(或实例)的指针。Objective-C运行时将取消引用您给它的指针,

日志:

名称:
我的理解是
vid
是指向
TestObj
类对象地址的指针,那么为什么
vid
可以直接发送到
testName
实例方法

另外,为什么
testName
方法调用
NSLog
将输出
而不是nil


谢谢。

我认为你基本上是幸运的,因为你没有因为代码而崩溃

首先,类方法以
+
开始,而不是
-
——因此这是您正在实现的实例方法

 name: <ViewController: 0x7ff3584b6580>
您不希望获取指向类对象(或实例)的指针。Objective-C运行时将取消引用您给它的指针,以便找到“isa”实例变量,该变量将是它所属的类。类对象的“isa”是“元类”,它包含类方法列表,因此类方法查找就是这样工作的。在您的示例中,它将取消对指针的引用并找到TestObj类,这意味着它认为它正在调用TestObj实例上的一个方法,而它不是--您还没有分配一个,但它实际上只是一个垃圾指针。但是,它仍然会(完全幸运地)进入您的实例方法实现,但是“self”并不是一个真正有效的实例。但是,不管值是什么,响应-name方法并返回具有该值的NSString或UIViewController实例本身都是如此。或者,它试图基于垃圾指针遵从实例变量,并通过偶然事件以指向ViewController实例的指针结束。我想那会尝试调用一个-name方法


无论如何,tl;dr——您的代码是非常错误的(不要使用类或实例的&指针),而且您很幸运没有崩溃。(桥id)强制转换隐藏了试图帮助您的警告。

很奇怪,您可以在指向类的指针上调用实例方法。查看如果将
testName
更改为类方法而不是实例方法会发生什么情况。-[TestObj testName]:发送到实例的无法识别的选择器
 name: <ViewController: 0x7ff3584b6580>
@interface TestObj :NSObject
@property(copy, nonatomic)NSString *name;
@end
@implementation TestObj
+ (void)testName{
NSLog(@"name:%@", @"TestObj"); // cannot reference ivars or properties in class method
}
@end
...
Class classObject = [TestObj class];
[classObject testName];