我正在开发 启用ARC 项目。从视图控制器我推动 MyClass ,
- (void)pushMyClass {
MyClass *myClass = [[MyClass alloc] init];
[self.navigationController pushViewController:myClass animated:YES];
}
在做了一些操作后,我正在弹出MyClass。这里的问题是 MyClass没有被解除分配 。以下是课程的外观。
/ * MyHelperClassDelegate * /
@protocol MyHelperClassDelegate <NSObject>
- (void)helperDidFinishHelping:(MyHelperClass *)helper;
@end
/ * MyHelperClass接口* /
@interface MyHelperClass : NSObject {
__weak id <MyHelperDelegate> delegate;
}
@property(nonatomic, weak) id<MyHelperDelegate> delegate;
- (void)startHelping;
@end
/ * MyHelperClass实施* /
@implementation MyHelperClass
@synthesize delegate;
- (void)dealloc {
delegate = nil;
}
/ * MyClass * /
@interface MyClass : UIViewController <MyHelperClassDelegate> {
MyHelperClass *helper;
}
@implementation MyClass {
- (void)dealloc {
helper.delegate = nil;
}
- (void)getHelp {
helper = [MyHelperClass new];
helper.delegate = self;
[helper startHelping];
}
- (void)helperDidFinishHelping:(MyHelperClass *)helper {
}
}
MyHelperClass 使用 NSMutalbleURLRequest &amp; NSURLConnection 获取一些数据并将其保存为用户默认值。
有一点需要注意的是,如果我对行 helper.delegate = self; 进行评论,那么MyClass将被取消分配。
如果MyClass弹出导航控制器,怎么做才能解除分配?
感谢。
答案 0 :(得分:2)
你的委托代码看起来是正确的(除了你使用ivar,你没有显示@synthesize所以你可能有_delegate并委托两者)。其他东西很可能会保留MyClass。我建议你做的是在你的MyClass dealloc中添加一个NSLog。然后按下它,然后立即按下后退按钮,看看它是否被释放。如果没有,那么仔细看看你在viewDidLoad等人中做了什么,并开始评论该代码的各个部分,直到你得到dealloc。
另外,我假设您没有在推送MyClass对象的类中保留强引用。
答案 1 :(得分:1)
我同意Chuck的说法,从提供的代码中可以说不出多少。但MyClass
对象未被解除分配的一个原因可能是helper
对象保留了它,因为delegate
被声明为strong
,而MyClass
对象的属性helper
也声明为强。在这种情况下,您有一个保留周期,但没有一个可以释放。
答案 2 :(得分:1)
诀窍可能在于你使用NSURLConnection
。未指定如何将此类与您提供的代码一起使用,但请注意NSURLConnection class reference中引用的特殊注意事项:
特殊注意事项:在下载过程中,连接会保持一个 强烈提及代表。它释放了强有力的参考 当连接完成加载,失败或被取消时。