Fix: objc_getAssociatedObject crashing on weak reference #161
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.
Description
It looks that the previous fix: #158 didn't actually fix the root of the problem. After more investigation, it seems the issue is related to
objc_associatedObject
API. TheOBJC_ASSOCIATION_ASSIGN
does not weakify references. More details about the issue can be found here: https://stackoverflow.com/questions/16569840/using-objc-setassociatedobject-with-weak-referencesHow to reproduce
This can actually be easily reproducible on a Playground:
Calling the
debugPrint(imageView.delegate)
will crash.Solution
Introduce a
objc_setAssociatedWeakObject
andobjc_getAssociatedWeakObject
to avoid the crash. Instead of using theOBJC_ASSOCIATION_ASSIGN
with the pointer directly, we use a block that stores a weak reference, and then useOBJC_ASSOCIATION_COPY
for the block.On the playground, if you replace the previous methods with the new ones, you will see that it doesn't crash anymore when accessing the
nil
delegate.