我试图创建一个类集群作为UIViewController
的子类来完成某些要点:
1。 ViewController的不同行为取决于实际的iOS版本
2。 iOS版本检查不会使代码混乱
3. 来电者不需要关心
到目前为止,我获得了课程MyViewController
,MyViewController_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:
。之后,如此创建的视图控制器被推送到UINavigationController
的导航堆栈。
这几乎与预期有关,但有一个很大的缺点:当从导航堆栈弹出时,ARC不会释放MyViewController_xxx
的实例。与哪个iOS版本无关。
我错过了什么?
更新: -initWithStuff:
-(id)initWithStuff:(StuffClass*)stuff
{
if (self = [super init])
{
self.stuff = stuff;
}
return self;
}
此方法也在MyViewController
中实现。稍后会出现差异(例如viewDidLoad:
)。
答案 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
- 对象保持活动状态,并且所有内容都可以正常运行。