财产如何与“自我”相关,反之亦然?

时间:2015-11-09 14:17:10

标签: ios objective-c objective-c-blocks retain-cycle

我的问题分为两部分:

首先,说我有一个班级:

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属性的块的方法。所以我更新的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

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

5 个答案:

答案 0 :(得分:2)

首先:name属性与MyClass,弱或其他无关。 (也就是说,如果您将name传递给某个任意方法,则它不会对MyClass实例进行任何引用,而该实例是属性。)

第二:由于您只是执行块而不是存储它,我不会看到保留周期的机会。

答案 1 :(得分:2)

1:MyClass实例保留了name属性,name属性本身不知道什么是MyClass因此,没有任何引用来自String-name到MyClass本身。

2:在以下代码中

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

self.name = @"Name changed inside block";[self setName:@"Name changed inside block"];

相同

所以你实际上在Block中保留MyClass实例,然后执行它的方法更新名称,(块需要指向这个Name的指针来改变它,对吧?块保留包含这个属性的类对象),你不会保留属性名称。

答案 2 :(得分:2)

  

我知道self会强烈保留name属性。但是怎么样   name属性是否与self相关?

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

  

我没有直接在我的块中引用self。所以,我想那里   这里没有保留周期。但我引用的是name属性   由自己持有。那么这会创建一个保留周期吗?

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

答案 3 :(得分:1)

但名称属性如何与自我相关?我的猜测是这将是一种弱关系。

name属性没有引用回self,因此属性strongweak不适用。对象实例只是收集到结构中的实例变量的集合。当我们谈论对象内存管理时,我们讨论的是包含该结构的内存。说一个属性(实际上是支持该属性的实例变量)具有对任何东西的引用是没有意义的。它只是self的一部分。

答案 4 :(得分:1)

  

我的问题:我知道自我将强烈拥有名称属性。但名称属性如何与自我相关?我的意思是我可以将名称作为self.name访问,但是在类实例化时,自我的孩子(在这种情况下是姓名)与自我有什么关系?我把这个类的结构想象成一棵树,父母对子女有强烈的引用,而孩子对父母的弱引用。我想知道我是否正确思考它。我猜这将是一种弱关系。

孩子可以引用父母,然后由于你提到的原因它应该是弱的。但是NSString个实例没有这样的向上引用。所以不能有保留周期。

一般来说,由你来管理这种反向关系。 (如果插入反向关系,Core Data会自动在其默认设置器中自动执行。)没有自动完成任何操作,没有定义向上引用,也没有设置向上引用。

  

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

您在块中引用self,因为您使用它。期。

但是保留周期需要两个引用。只要在块内使用self,但块不存储在self的属性中(直接或间接),就不会发生保留周期。