1

我正在尝试创建一个类集群作为子类UIViewController来完成一些要点:

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

2. iOS 版本检查不会弄乱代码

3.来电者无需关心

到目前为止,我得到了课程MyViewControllerMyViewController_iOS7并且MyViewController_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:. 之后,如此创建的视图控制器被推送到 aUINavigationController的导航堆栈上。

这几乎可以按预期工作,但有一个很大的缺点:ARC 不会释放MyViewController_xxx从导航堆栈中弹出的实例。哪个iOS版本无关紧要。

我错过了什么?

更新: -initWithStuff:

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

    return self;
}

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

4

1 回答 1

0

首先:感谢您的所有帮助,评论,答案,建议......

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

viewDidLoad我做了以下事情:

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

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

修复如下:

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

现在该块捕获weakSelf. 这样它就不能让MyViewController-object 保持活动状态,并且所有东西都可以正常工作。

于 2014-05-05T22:14:15.430 回答