Ios ARC:对象-委托关系

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

我正在开发一个启用ARC的项目。从一个视图控制器我推我的类

在做了一些操作之后,我正在弹出我的类。这里的问题是,MyClass没有被解除分配。下面是这些类的外观

/*MyHelperClassDelegate*/

@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 {
    }
}