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.
I discovered that one (but perhaps not the only?) way to cause the swizzling to infinite loop is with inheritance. The test case in this PR shows it, but what could happen is:
Checking that the actual implementations that we intend to swap are different is the key here.
In my investigation and testing, I also notice we were trying to swizzle the same class multiple times. The guard checks in the
Swizzler
prevent anything bad from happening, but it's still unnecessary, so I added aSet
to track what's been swizzled to prevent repeat attempts that could potentially cause something to break.And for the case where a scroll view has a
nil
delegate, we can just assign itAppcuesScrollViewDelegate.shared
with the implementation we need instead of also swizzling theAppcuesScrollViewDelegate.shared
since we own its implementation. This just saves us from more swizzling in this one case, making things a bit safer overall.This should fix #582