2015-02-08 280 views
0

Apple的文档中提到“当触发segue时,会导致新的视图控制器被实例化并在屏幕上转换。”我看到的一些行为让我质疑VC是否真的被销毁,并且每次视图都会被重新创建。viewController生命周期

在我的应用程序每次我塞克到特定视图时我注意到下面的viewController函数被调用(这是与VC一致在每次sequed时间被重新创建):

- (id)initWithCoder:(NSCoder *)aDecoder 

注,这是的viewController也是一个数据源为它的的CollectionView和有一个属性:

@property (strong, nonatomic) NSMutableArray *messages; 

而且每次的initWithCoder叫我ALLOC时间和初始化一个消息数组,并将其分配给上述指针。

当我导航回到另一个视图,然后再次返回时,我看到奇怪,我认为VC可能被重新使用。或者,如果第一个实例没有被销毁并且仍然可以接收通知。

第一件奇怪的事情是,在viewDidLoad中,如果我为特定的通知调用addObserver:self,我希望这个VC处理,那么我第二次进入这个VC时,我会得到两个通知发送给VC的通知处理每个发送的通知。这与被重用的VC一致,否则为什么处理程序会被调用两次?

但与这种重用场景相反,initWithCoder实际上是在第二次加载视图时调用的。

由于我不想为每个通知帖子生成2个或更多通知,我使用静态布尔值来保证addObserver只被调用一次。即addObserver仅在第一次调用viewDidLoad时调用,而不是后续时间。

viewDidLoad和通知处理程序访问消息数组。在第二个seque中,viewDidLoad似乎访问一个新的alloc/init'd消息数组,但是当通知处理程序访问消息时,它似乎是上次加载VC时的前一个消息数组。

任何想法?

回答

0

一旦视图被解散,请确保您在这些特定键上取消注册为观察者。您可能仍然执行旧方法,因为它们从未未注册。

+0

是的我在晚餐时就考虑过这个问题,我认为这肯定是通知中心对viewController持有一个强烈的引用。 – bhartsb 2015-02-08 03:47:37