ARC:对象 - 委托关系

时间:2013-04-11 17:14:17

标签: ios objective-c automatic-ref-counting

我正在开发 启用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弹出导航控制器,怎么做才能解除分配?

感谢。

3 个答案:

答案 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中引用的特殊注意事项:

  

特殊注意事项:在下载过程中,连接会保持一个   强烈提及代表。它释放了强有力的参考   当连接完成加载,失败或被取消时。