这是上一个问题的后续问题,其中可能包含过多的间接细节。考虑以下代码:
BarViewController.h
#import <UIKit/UIKit.h>
@protocol SomeDelegate
- (void)someCallback; // doesn't matter
@end
@interface BarViewController : UIViewController
@property (weak, nonatomic) id <SomeDelegate> delegate;
@end
BarViewController.m
#import "BarViewController.h"
@interface BarViewController ()
@end
@implementation BarViewController
@end
FooViewController.h
#import <UIKit/UIKit.h>
@interface FooViewController : UIViewController
@end
FooViewController.m
#import "FooViewController.h"
#import "BarViewController.h"
@interface FooViewController () <SomeDelegate>
@end
@implementation FooViewController
- (void)viewDidLoad
{
[super viewDidLoad];
BarViewController *bar = [[BarViewController alloc] init];
// does this assignment create a "strong" reference i.e. increase retain count by 1?
bar.delegate = self;
// *do some useful stuff with bar.delegate here* //
bar = nil; // is memory for bar.delegate free'd here,
// or only after this instance of FooViewController is destroyed?
}
#pragma mark - SomeDelegate
- (void)someCallback {
// doesn't matter
}
@end
想象一下,它FooViewController
是某个小型应用程序中的主视图控制器,而那BarViewController
只是一些短暂的东西,可能旨在让用户选择几个按钮中的一个。 BarViewController
报告通过其代表选择的内容。
在我上面的代码中,当我设置bar
为nil
inFooViewController.m
时,为 预留的内存会发生什么bar.delegate
?一方面,我认为设置bar
为nil
可能会导致bar.delegate
也设置为被释放对象nil
的一部分。bar
另一方面,我对weak
引用的理解是,只有在没有人强烈指向它时才会释放内存。因此,如果bar.delegate = self
创建对delegate
(是吗?)的强引用,是否有可能以bar.delegate
某种方式仍然持有指向我们的实例的指针FooViewController
,即使bar
是现在nil
?这里有内存泄漏的可能性吗?
编辑:
所以我正在考虑的方式是,UIWindow
强烈指向我们的实例FooViewController
作为根视图控制器,而我们的 BarViewController 实例将弱指向我们的实例FooViewController
作为它的委托。因此,即使我们设置bar = nil
, bar.delegate
weakly 指向一个对象,该对象仍然至少有一个来自 的强指针UIWindow
,所以bar.delegate
不能基于“当没有其他人强烈指向它时释放一个弱属性”的前提来释放它?