gpt4 book ai didi

ios - 属性如何与 "self"相关,反之亦然?

转载 作者:行者123 更新时间:2023-12-01 17:24:50 24 4
gpt4 key购买 nike

我的问题分为两部分:

第一 , 假设我有一个类:

MyClass.h

@interface MyClass: NSObject

-(id)initWithName:(NSString*)name;

@property(nonatomic, strong) NSString *name;

@end

MyClass.m
@implementation MyClass

-(id)initWithName:(NSString*)name
{
if (self = [super init])
{
self.name = name;
}
return self;
}

@end

我的问题:我知道 self 会强烈地持有 name 属性。但是 name 属性与 self 有什么关系呢?我的意思是我可以将 name 作为 self.name 访问,但是在类实例化时,self 的子项(在本例中是 name)与 self 有什么关系?我将类的结构想象成一棵树,父级对子级持有强引用,子级对父级持有弱引用。我想知道我的想法是否正确。我的猜测是这将是一个弱关系。

第二 ,如果我添加一个方法,该方法具有引用 name 属性的 block 。所以我更新的 MyClass.m 实现是:

MyClass.m
@implementation MyClass

-(id)initWithName:(NSString*)name
{
if (self = [super init])
{
self.name = name;
}
return self;
}

-(void)doSomeStuff
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.name = @"Name changed inside block";
}];
}

@end

我的第二个问题是:我没有直接在我的 block 内引用 self 。所以,我想这里没有保留周期。但我引用的是自己持有的名称属性。那么这会创建一个保留周期吗?

最佳答案

I know that self will hold the name property strongly. But how will the name property relate to self?



每个属性都有一个支持实例变量,通常命名为与具有前导下划线和 getter 和/或 setter 方法的属性相同。没有关系;该属性通常使类实例更大(由于额外的实例变量)和类更大(由于额外的方法)。

I am not referencing self directly inside my block. So, I guess there is no retain cycle here. But I am referencing name property which is held by self. So does this create a retain cycle?



是的,您引用的是 self直接,所以保留循环是可能的。然而,保留周期只能在某些情况下发生,通过创建对 self 的弱引用来避免这种情况通常更安全。并在 block 内使用它。

关于ios - 属性如何与 "self"相关,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611124/

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