您尚未提供源代码,但在遇到此问题时,我有一些建议:
首先,在要弹出的对象上实现该-(void)dealloc
方法,UIViewController
并在执行实际弹出时查看它是否被调用(在其中放置断点)。如果不是,发生的事情是它UIViewController
被其他对象保留。
使用静态分析器检查它是否在您的代码中发现问题:
还要确保您没有遇到保留周期。
对于块:
块将所有对象保留在其范围内,除非您明确告诉它们不要这样做。如果您的对象也保留此块,您将进入保留周期。为了防止这种情况,您通常希望创建一个指向 self 的弱指针。
- (void)someMethod
{
_weak id weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // retain cycle free!
};
}
对于组成:
如果您有一个对象保留另一个对象,而另一个对象又保留第一个对象,您也会遇到一个保留周期。例如:
@interface ObjectA : NSObject
@property (strong, nonatomic) ObjectB *objectB;
@end
@implementation
- (id)init
{
self = [super init];
if (self) {
self.objectB = [[ObjectB alloc] initWithObjectA:self]; // self.objectB gets retained
}
return self;
}
@end
@interface ObjectB : NSObject
@property (strong, nonatomic) ObjectA *objectA; // the strong directive will cause a retain cycle, this should be weak
- (id)initWithAnObjectA:(ObjectA *)objectA;
@end
@implementation ObjectB
- (id)initWithAnObjectA:(ObjectA *)objectA;
{
self = [super init];
if (self) {
self.objectA = objectA; // self.objectA gets retained, leading to a retain cycle
}
return self;
}
@end