viewController 生命周期
viewController lifecycle
Apple 的文档说 "When a segue is triggered, it causes a new view controller to be instantiated and transitioned onscreen." 我看到的一些行为让我怀疑 VC 是否真的在每次视图被更新时被销毁并重新创建。
在我的应用程序中,每次我序列到一个特定的视图时,我注意到下面的 viewController 函数被调用(这与每次序列化时重新创建的 VC 一致) :
- (id)initWithCoder:(NSCoder *)aDecoder
请注意,此 viewController 也是其 collectionView 的数据源,并且具有 属性:
@property (strong, nonatomic) NSMutableArray *messages;
每次调用 initWithCoder 时,我都会分配并初始化一个消息数组并将其分配给上述指针。
当我导航回另一个视图然后再次返回时,我看到奇怪的东西让我认为 VC 可能被重新使用。或者如果第一个实例没有被销毁并且仍然可以接收通知。
第一件奇怪的事情是,在 viewDidLoad 中,如果我调用 addObserver:self 以获得我希望此 VC 处理的特定通知,那么我第二次进入此 VC 对于每个发送的通知,我都会收到发送到 VC 的通知处理程序的两个通知。这与重用 VC 一致,否则为什么处理程序会被调用两次?
但是与这种重用场景相反的是,实际上是在第二次加载视图时调用了 initWithCoder。
因为我不想为每个通知生成 2 个或更多通知 post,我使用静态布尔值来保证 addObserver 只被调用一次。 IE。 addObserver 仅在第一次调用 viewDidLoad 时被调用,之后不会被调用。
viewDidLoad 和通知处理程序访问消息数组。在第二个序列中,viewDidLoad 似乎访问了一个新的 alloc/init 消息数组,但是当通知处理程序访问消息时,它似乎是上一次加载 VC 时的先前消息数组。
有什么想法吗?
请确保在关闭视图后,您正在注销自己作为这些特定键的观察者。您可能仍在执行旧方法,因为它们从未取消注册。
Apple 的文档说 "When a segue is triggered, it causes a new view controller to be instantiated and transitioned onscreen." 我看到的一些行为让我怀疑 VC 是否真的在每次视图被更新时被销毁并重新创建。
在我的应用程序中,每次我序列到一个特定的视图时,我注意到下面的 viewController 函数被调用(这与每次序列化时重新创建的 VC 一致) :
- (id)initWithCoder:(NSCoder *)aDecoder
请注意,此 viewController 也是其 collectionView 的数据源,并且具有 属性:
@property (strong, nonatomic) NSMutableArray *messages;
每次调用 initWithCoder 时,我都会分配并初始化一个消息数组并将其分配给上述指针。
当我导航回另一个视图然后再次返回时,我看到奇怪的东西让我认为 VC 可能被重新使用。或者如果第一个实例没有被销毁并且仍然可以接收通知。
第一件奇怪的事情是,在 viewDidLoad 中,如果我调用 addObserver:self 以获得我希望此 VC 处理的特定通知,那么我第二次进入此 VC 对于每个发送的通知,我都会收到发送到 VC 的通知处理程序的两个通知。这与重用 VC 一致,否则为什么处理程序会被调用两次?
但是与这种重用场景相反的是,实际上是在第二次加载视图时调用了 initWithCoder。
因为我不想为每个通知生成 2 个或更多通知 post,我使用静态布尔值来保证 addObserver 只被调用一次。 IE。 addObserver 仅在第一次调用 viewDidLoad 时被调用,之后不会被调用。
viewDidLoad 和通知处理程序访问消息数组。在第二个序列中,viewDidLoad 似乎访问了一个新的 alloc/init 消息数组,但是当通知处理程序访问消息时,它似乎是上一次加载 VC 时的先前消息数组。
有什么想法吗?
请确保在关闭视图后,您正在注销自己作为这些特定键的观察者。您可能仍在执行旧方法,因为它们从未取消注册。