2013-04-11 63 views
2

我正在开发一个ARC启用项目。从视图控制器我推MyClass的ARC:对象 - 代表关系

- (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 & NSURLConnection的来获取一些数据的Web服务,并将其保存到用户的默认值。

有一点需要注意的是,如果我评论行helper.delegate = self;,那么MyClass被取消分配。

如何让MyClass在导航控制器弹出时被取消分配?

谢谢。

+2

您已经包含了很多代码,这些代码似乎与您所询问的这个MyClass实例无关,与此无关。这个MyHelperClass事情与任何事情有什么关系?我认为要么你需要更清楚你的代码实际在做什么,或者你需要包含更多相关的代码。 – Chuck 2013-04-11 17:25:39

+0

如果你拿出'helper.delegate = self'这行,它是否会被释放?如果行为没有改变,那么问题就在于别的地方。 – 2013-04-11 17:31:23

+0

您是否添加了断点或nslog语句来释放以验证其被调用? – 2013-04-11 18:54:24

回答

2

你的委托代码看起来是正确的(除了使用ivar,你不会显示@synthesize,所以你可能有_delegate和委托两者)。很可能还有别的东西在保留MyClass。我建议你做的是添加一个NSLog到你的MyClass dealloc。然后按下它,然后立即按下后退按钮,看看它是否被释放。如果不是,那么请仔细看看viewDidLoad等人做了什么,然后开始评论这些代码的各个部分,直到获得dealloc。

此外,我假设你不会在推动MyClass对象的类中保留强引用。

+0

嗨@大卫,我编辑了我的问题。请看看能否帮助我。谢谢。 – EmptyStack 2013-04-12 04:29:53

+0

你的答案帮助我到达那里。另一种观点是保留我的班级。谢谢。并感谢大家的帮助! – EmptyStack 2013-04-12 12:02:39

1

我同意查克说,不能从提供的代码中说很多。但MyClass对象未被释放的一个原因可能是它由您的helper对象保留,因为delegate被声明为strong,并且MyClass对象的属性helper也被声明为强。在这种情况下,你有一个保留周期,并且它们都不能被释放。

+0

嗨@ReinhardMänner,我编辑了我的问题。请看看能否帮助我。谢谢。 – EmptyStack 2013-04-12 04:29:13

1

诀窍可以您使用NSURLConnection事实中可能说谎。它没有规定如何使用这个类根据您所提供的代码,但请注意在NSURLConnection class reference引用的特殊注意事项:

特别注意事项:在下载过程中的连接保持 强引用给代表。当连接完成加载,失败或取消时,它会释放该强引用 。