gpt4 book ai didi

objective-c - 为什么在避免 block 保留循环时使用 typeof() 而不是对象类型?

转载 作者:太空狗 更新时间:2023-10-30 04:00:55 24 4
gpt4 key购买 nike

当其他 ObjC 开发人员打破保留周期时,我经常看到这段代码。

__weak typeof(self) weakSelf = self;
[someObject doThingWithCompletion:^{
typeof(weakSelf) strongSelf = weakSelf;
[strongSelf awesomeThingOne];
[strongSelf moreAwesome];
}];

为什么要使用 typeof() 宏?这是 block 独有的吗?

我最初的想法是self 的类型可能未知(这似乎几乎不可能,但让我们假装...)。如果类型未知,那么为什么不使用 id 声明 weakSelf:__weak id weakSelf = self;

我的第二个想法是它可以防止子类化,但这似乎不太可能导致问题。假设 ObjTwoAwesomeObj 的子类并重写 awesomeThingOne 方法。如果 selfObjTwoAwesomeObj 的实例,上面的假代码应该可以正常工作。

最佳答案

typeof() 宏允许一些事情。

首先,就我个人而言,我已经用这类东西创建了一个代码片段。而不是必须输入:

__weak MyClass *weakSelf = self;

每次我想设置它时,将 MyClass 替换为适当的类,我可以开始键入 weakSelf,Xcode 的自动完成功能将尝试提供我的这行代码:

__weak typeof(self) weakSelf = self;

这每次都会奏效。


此外,使用 typeof() 为我们提供了一个显式类型,并最大限度地减少了在我们更改实际类型时要重写的代码。

id 是不安全的,它不会为我们提供可用方法和属性的自动完成。毕竟,weakSelf 现在是 id 类型,而不是 MyClass 类型。

我们可能会遇到与子类相同的问题,如果我只是默认为 MyClass,则执行以下操作:

weak MyClass *weakSelf = self;

如果 self 实际上是 MySubClass,则不会自动完成 MySubClass 添加的方法/属性。


typeof() 的使用完全不限于 block 。我喜欢在类方法中使用 typeof()

通常,以下内容就足够了:

+ (instancetype)myInstance {
return [[self alloc] init];
}

因为 instancetype[self alloc] 负责获取正确的子类。

但是假设我们想要更复杂的东西:

+ (NSMutableArray *)arrayOfInstances;

我们如何确保我们粘贴到数组中的对象是正确的类型?

+ (NSMutableArray *)arrayOfInstances {
NSMutableArray *instances = [NSMutableArray array];

for (int i = 0; i < 10; ++i) {
typeof([self alloc]) newObj = [[self alloc] init];
newObj.someIntProperty = i;
[instances addObject:newObj];
}

return instances;
}

我们不想使用 id 作为 newObj 的类型。我们想确定如果我们调用:

[MyClass arrayOfInstances];

我们得到一个 MyClass 对象数组,但是如果我们调用:

[MySubClass arrayOfInstances];

我们得到了一组 MySubClass 对象等。


如果我们想从定义我们对象的字典中实例化一个对象,我们也可以使用 typeof():

Class dynamicType = myDict[@"Class"];
typeof([dynamicType alloc]) myObject = [[dynamicType alloc] init];
myObject.foo = myDict[@"Foo"];
myObject.bar = myDict[@"Bar"];

关于objective-c - 为什么在避免 block 保留循环时使用 typeof() 而不是对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26819430/

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