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时的前一个消息数组。
任何想法?
是的我在晚餐时就考虑过这个问题,我认为这肯定是通知中心对viewController持有一个强烈的引用。 – bhartsb 2015-02-08 03:47:37