带有ARC的类集群

时间:2014-05-05 13:51:13

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

我试图创建一个类集群作为UIViewController的子类来完成某些要点:

1。 ViewController的不同行为取决于实际的iOS版本

2。 iOS版本检查不会使代码混乱

3. 来电者不需要关心

到目前为止,我获得了课程MyViewControllerMyViewController_iOS7MyViewController_Legacy

要创建实例,我调用方法myViewControllerWithStuff:(StuffClass*)stuff,其实现方式如下:

+(id)myViewControllerWithStuff:(StuffClass*)stuff
{
    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
    {
        return [[MyViewController_iOS7 alloc] initWithStuff:stuff];
    }
    else
    {
        return [[MyViewController_Legacy alloc] initWithStuff:stuff];
    }
}

来电者使用myViewControllerWithStuff:。之后,如此创建的视图控制器被推送到UINavigationController的导航堆栈。

这几乎与预期有关,但有一个很大的缺点:当从导航堆栈弹出时,ARC不会释放MyViewController_xxx的实例。与哪个iOS版本无关。

我错过了什么?

更新: -initWithStuff:

-(id)initWithStuff:(StuffClass*)stuff
{
    if (self = [super init])
    {
        self.stuff = stuff;
    }

    return self;
}

此方法也在MyViewController中实现。稍后会出现差异(例如viewDidLoad:)。

1 个答案:

答案 0 :(得分:0)

首先:感谢您的所有帮助,意见,答案和建议......

当然还有对strong - 对象的另一个MyViewController引用。但它并不那么明显,因为它不是属性或实例变量。

viewDidLoad我做了以下事情:

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    [self saveState];
}];

如果用户将应用程序发送到后台,这可以防止数据丢失。当然,该块会捕获其环境所需的部分。在这种情况下,它捕获了self。该块使self保持活动状态,直到它(块)被破坏为止,例如, [[NSNotificationCenter defaultCenter] removeObserver:self];被调用。但是,运气不好,这个调用放在dealloc的{​​{1}}方法中,只要该块存在就不会被调用...

修复方法如下:

MyViewController

现在该块捕获__weak MyViewController *weakSelf = self; [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { [weakSelf saveState]; }]; 。这样它就无法使weakSelf - 对象保持活动状态,并且所有内容都可以正常运行。