Fix crash when cancelling subscription for custom PersistenceKey #3494
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We have a custom conformance of
PersistenceKey
that calledShared<Value>.Subscription.cancel()
on the base persistence key in its ownonCancel
closure:When upgrading to 1.16.0, that logic started crashing with
AppStorageKey
becauseShared<Value>.Subscription
also callscancel()
from itsdeinit
and key-value observing does not allow that:Caution
Cannot remove an observer
<_TtCGV22ComposableArchitecture13AppStorageKeyGSqSS__P10$1353d4f8c8Observer 0x6000002848a0>
for the key path"stringKey"
from<NSUserDefaults 0x600000dd3cf0>
because it is not registered as an observer.In our case, the sufficient workaround was to change the call to
subscription.cancel()
into just an extended lifetime_ = subscription
and call it a day.But I think it's still a wart that
Shared<Value>.Subscription
allowed this to crash!This PR reproduces the crash with a (rather artificial) unit test and follows up with a proposed fix.