gpt4 book ai didi

iOS类方法

转载 作者:可可西里 更新时间:2023-11-01 06:02:29 25 4
gpt4 key购买 nike

@interface TestObj :NSObject
@property(copy, nonatomic)NSString *name;
@end
@implementation TestObj
- (void)testName{

NSLog(@"name:%@",self.name);

}
@end

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {

[super viewDidLoad];

id tclass =[TestObj class];

void * vid = &tclass;

[(__bridge id)vid testName];

}
@end

日志:

 name: <ViewController: 0x7ff3584b6580>

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

另外,为什么 testName方法调用 NSLog将输出 <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];

您不想使用指向类对象(或实例)的指针。 Objective-C 运行时将取消引用您提供的指针,以便找到“isa”实例变量,这将是它所属的类。类对象的“isa”是“元类”,它包含类方法列表,这就是类方法查找的工作原理。在你的例子中,它会取消引用指针并找到 TestObj 类,这意味着它认为它正在调用 TestObj 实例上的方法,而实际上它不是 - 你没有分配一个,但它实际上只是一个垃圾指针。但是,它仍然(完全幸运)进入您的实例方法实现,但“self”并不是真正有效的实例。然而,看起来无论值是什么,恰好响应一个 -name 方法并返回具有该值的 NSString 或 UIViewController 实例本身。或者它可能试图基于垃圾指针来引用实例变量,并最终偶然得到一个指向 ViewController 实例的指针。不过,我认为这会尝试调用 -name 方法。

无论如何,tl;dr——你的代码完全错误(不要使用 & 类或实例的指针)而且你很幸运没有崩溃。 (bridge id) cast 隐藏了试图帮助你的警告。

关于iOS类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39783182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com