viewController生命周期

时间:2015-02-08 02:16:59

标签: ios uiviewcontroller instantiation lifecycle

Apple的文档说"当触发segue时,它会导致新的视图控制器被实例化并在屏幕上转换。"我看到的一些行为让我质疑VC是否实际被破坏并在每次查看时都会重新创建。

在我的应用程序中,每次我查看特定视图时,我都会注意到以下viewController函数被调用(这与每次被查询时重新创建的VC一致):

- (id)initWithCoder:(NSCoder *)aDecoder 

注意,这个viewController也是它的collectionView的数据源,并且有一个属性:

@property (strong, nonatomic) NSMutableArray *messages;

每次调用initWithCoder时,我都会分配并初始化一个消息数组并将其分配给上面的指针。

当我导航回另一个视图然后再次查看时,我看到了让我觉得VC可能被重复使用的陌生感。或者,如果第一个实例没有被破坏并且仍然可以接收通知。

第一件奇怪的是,在viewDidLoad中如果我调用addObserver:self来获取我希望这个VC处理的特定通知,那么第二次我将这个VC设置为VC我会收到两个发送给VC的通知&#39 ; s发送的每个通知的通知处理程序。这与VC被重用是一致的,否则为什么处理程序会被调用两次?

但是,与这种重用方案相反,initWithCoder实际上是在第二次加载View时被调用。

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

确保您在取消视图后取消注册这些特定键的观察者。您可能仍在执行旧方法,因为它们从未取消注册。