我的问题分为两部分:
首先,说我有一个班级:
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
我的第二个问题是:我没有直接在我的区块内引用自我。所以,我想这里没有保留周期。但我引用自己持有的名称属性。那么这会创建一个保留周期吗?
答案 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
,因此属性strong
和weak
不适用。对象实例只是收集到结构中的实例变量的集合。当我们谈论对象内存管理时,我们讨论的是包含该结构的内存。说一个属性(实际上是支持该属性的实例变量)具有对任何东西的引用是没有意义的。它只是self
的一部分。
答案 4 :(得分:1)
我的问题:我知道自我将强烈拥有名称属性。但名称属性如何与自我相关?我的意思是我可以将名称作为self.name访问,但是在类实例化时,自我的孩子(在这种情况下是姓名)与自我有什么关系?我把这个类的结构想象成一棵树,父母对子女有强烈的引用,而孩子对父母的弱引用。我想知道我是否正确思考它。我猜这将是一种弱关系。
孩子可以引用父母,然后由于你提到的原因它应该是弱的。但是NSString
个实例没有这样的向上引用。所以不能有保留周期。
一般来说,由你来管理这种反向关系。 (如果插入反向关系,Core Data会自动在其默认设置器中自动执行。)没有自动完成任何操作,没有定义向上引用,也没有设置向上引用。
我的第二个问题是:我没有直接在我的区块内引用自我。所以,我想这里没有保留周期。但我引用自己持有的名称属性。那么这会创建一个保留周期吗?
您在块中引用self
,因为您使用它。期。
但是保留周期需要两个引用。只要在块内使用self
,但块不存储在self
的属性中(直接或间接),就不会发生保留周期。