Ios ARC:对象-委托关系
我正在开发一个启用ARC的项目。从一个视图控制器我推我的类 在做了一些操作之后,我正在弹出我的类。这里的问题是,MyClass没有被解除分配。下面是这些类的外观 /*MyHelperClassDelegate*/Ios ARC:对象-委托关系,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,我正在开发一个启用ARC的项目。从一个视图控制器我推我的类 在做了一些操作之后,我正在弹出我的类。这里的问题是,MyClass没有被解除分配。下面是这些类的外观 /*MyHelperClassDelegate*/ @protocol MyHelperClassDelegate <NSObject> - (void)helperDidFinishHelping:(MyHelperClass *)helper; @end /*我的班级*/ @interface MyClass : UI
@protocol MyHelperClassDelegate <NSObject>
- (void)helperDidFinishHelping:(MyHelperClass *)helper;
@end
/*我的班级*/
@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 {
}
}
@接口MyClass:UIViewController{
MyHelperClass*助手;
}
@MyClass的实现{
-(无效)解除锁定{
helper.delegate=nil;
}
-(无效)获取帮助{
helper=[MyHelperClass new];
helper.delegate=self;
[助手启动];
}
-(void)HelperIDFinishHelping:(MyHelperClass*)helper{
}
}
MyHelperClass使用nsMutalBlerUrlRequest&NSURLConnection调用web服务以获取一些数据并将其保存为用户默认值
这里需要注意的一点是,如果我对行helper.delegate=self;,进行注释;,然后MyClass被释放
当MyClass从导航控制器弹出时,如何使其解除分配
谢谢。您的委托代码看起来是正确的(除了您使用ivar外,您没有显示@synthesis,因此您可能同时拥有_delegate和delegate)。很可能是别的什么东西在留住我的班级。我建议您在MyClass dealloc中添加一个NSLog。然后按下它,并立即按下后退按钮,看看它是否解除锁定。如果没有,那么仔细看看您在viewDidLoad等中所做的工作,并开始注释代码的各个部分,直到您获得dealloc
另外,我假设您没有在推送MyClass对象的类中保留强引用。您的委托代码看起来是正确的(除了使用ivar之外,您没有显示@synthesis,因此您可能同时拥有_delegate和delegate)。很可能是别的什么东西在留住我的班级。我建议您在MyClass dealloc中添加一个NSLog。然后按下它,并立即按下后退按钮,看看它是否解除锁定。如果没有,那么仔细看看您在viewDidLoad等中所做的工作,并开始注释代码的各个部分,直到您获得dealloc
另外,我假设在推送MyClass对象的类中没有保留强引用。我同意Chuck的观点,即从提供的代码中不能说太多。但是,
MyClass
对象未解除分配的一个原因可能是它被您的helper
对象保留,因为delegate
被声明为strong
,而MyClass
对象的属性helper
也被声明为strong。在这种情况下,您有一个retain循环,并且没有一个可以被释放。我同意Chuck的观点,从提供的代码中不能说太多。但是,MyClass
对象未解除分配的一个原因可能是它被您的helper
对象保留,因为delegate
被声明为strong
,而MyClass
对象的属性helper
也被声明为strong。在这种情况下,您有一个保留周期,并且没有一个可以释放。技巧可能在于您使用了NSURLConnection
。未指定如何将此类与您提供的代码一起使用,但请注意以下文件中引用的特殊注意事项:
特殊注意事项:下载过程中,连接会保持
对代表的强引用。它释放了强烈的参考
当连接完成加载、失败或被取消时
诀窍可能在于使用
NSURLConnection
。未指定如何将此类与您提供的代码一起使用,但请注意以下文件中引用的特殊注意事项:
特殊注意事项:下载过程中,连接会保持
对代表的强引用。它释放了强烈的参考
当连接完成加载、失败或被取消时
您已经包含了很多代码,这些代码似乎与您所询问的MyClass实例无关,但与之相关的代码却很少。这个MyHelperClass的东西跟什么有关系?我认为要么你需要更清楚你的代码实际上在做什么,要么你需要包含更多相关的代码。如果你去掉
helper.delegate=self
行,它是否会被释放?如果行为没有改变,那么问题就出在其他地方。您是否向dealloc添加了断点或nslog语句以验证其是否被调用?@Ash-Furrow,是的。如果我没有设置委托,那么MyClass将被释放。谢谢。@andrewlattis,是的。我添加了断点。它无法到达那里。谢谢。您包含了很多代码,这些代码似乎与您所询问的MyClass实例无关,但与之相关的代码却很少。这个MyHelperClass的东西跟什么有关系?我认为要么你需要更清楚你的代码实际上在做什么,要么你需要包含更多相关的代码。如果你去掉helper.delegate=self
行,它是否会被释放?如果行为没有改变,那么问题就出在其他地方。您是否向dealloc添加了断点或nslog语句以验证其是否被调用?@Ash-Furrow,是的。如果我没有设置委托,那么MyClass将被释放。谢谢。@andrewlattis,是的。我添加了断点。它无法到达那里。谢谢。嗨@Reinhard Männer,我编辑了我的问题。请看能不能帮我。谢谢。嗨@Reinhard Männer,我编辑了我的问题。请看能不能帮我。谢谢。你好,大卫,我已经编辑了我的问题。请看能不能帮我。谢谢。你的回答帮助我到达了那里。另一种观点是保留我的课程。非常感谢。谢谢大家的帮助!你好,大卫,我已经编辑了我的问题。请看
@interface MyHelperClass : NSObject {
__weak id <MyHelperDelegate> delegate;
}
@property(nonatomic, weak) id<MyHelperDelegate> delegate;
- (void)startHelping;
@end
@implementation MyHelperClass
@synthesize delegate;
- (void)dealloc {
delegate = nil;
}
@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 {
}
}