johnno1962 / InjectionIII

Re-write of Injection for Xcode in (mostly) Swift
MIT License
4.06k stars 319 forks source link

symbol not found in flat namespace #379

Closed Eric217 closed 2 years ago

Eric217 commented 2 years ago

Hi John, This is the output(using 4.1.3):

⚠️ dlopen() error: dlopen(/Users/eric/Library/Developer/CoreSimulator/Devices/06ABA9F2-71CD-47B8-9690-C6ED4E8C6D1E/data/Containers/Data/Application/EFB0F911-5FF2-465A-A8E5-B1E659E8A7C0/tmp/eval101.dylib, 0x0002): symbol not found in flat namespace '_$s7ZHUIKit5ToastC4show_8duration5themeySS_AA0B8DurationOSo11ZHThemeModeVtFZfA0_'

Seems 'unhide' not working, after restarting (with or without building) my app. The code is inside Development pods. Your readme mentions unhide is integrated into InjectionIII, so any other steps needed to do by myself, besides restart the app?

johnno1962 commented 2 years ago

Hi Eric, thanks for letting me know. I'm trying to phase out unhide as it can cause problem where you need to do a clean build and with Xcode 13 it seemed to be no longer necessary. Seems like it is still required though (cross module?) so I've added code that forces an unhide when you get this error: https://github.com/johnno1962/InjectionIII/releases/tag/4.1.5

Eric217 commented 2 years ago

Hi Eric, thanks for letting me know. I'm trying to phase out unhide as it can cause problem where you need to do a clean build and with Xcode 13 it seemed to be no longer necessary. Seems like it is still required though (cross module?) so I've added code that forces an unhide when you get this error: https://github.com/johnno1962/InjectionIII/releases/tag/4.1.5

Good Monday. I just used the new release and expectedly got this error:

⚠️ Loading .dylib has failed, This is likely because Swift code being injected refers to a function with a default argument. Rebuilding and re-running your project (without a build clean) can resolve this.

I built and run the project, same log appeared. Was unhide script executed??? (I don't know how it works, no run script phase, no execution record in the build log or tmp folder logs, for now)

Screen Shot 2022-03-07 at 11 04 17
johnno1962 commented 2 years ago

Unhide is integrated into InjectionIII now. If you saw that message it should have run internally. Sounds like a complex project. I can look at this on zoom if you like.

johnno1962 commented 2 years ago

I've uploaded https://github.com/johnno1962/InjectionIII/releases/tag/4.1.6 which allows you to opt-into the old behaviour by providing a value for the environment variable INJECTION_UNHIDE (this time communicating this value to the InjectionIII.app which performs the unhide). Can you give it a try for me please?

Eric217 commented 2 years ago

Teamviewer available at 22:00 GMT+8, how can i get to you? Tomorrow I'll try this release; Today I built same pod in another workspace, and unhide (4.1.5) worked. Give me more time test this.

johnno1962 commented 2 years ago

Hi, sounds good if you still need to. Can you email the details to github at johnholdsworth.com?

Eric217 commented 2 years ago

4.1.6 with INJECTION_UNHIDE worked. But I encountered another problem: Sometimes app still runs original code after injection. I can't always replicate this, but once it happens, following injections always 'fail'-- logs read everything ok but the actual running code is original. If this happens frequently I'll email teamviewer.

Update: I found injection could recover, like this:
save file A: run original code save file A: run original code save file B: run original code save file C: C run new code (from now on, all becomes normal) save file A: A run new code save file B: B run new code ...

johnno1962 commented 2 years ago

Hmm... that would be a problem. Not superclass methods by any chance? If you get stuck reach out tomorrow AM my time (Italy) and I can take a look or you can set the environment variable INJECTION_DETAIL to get a better idea what's going on.

johnno1962 commented 2 years ago

I'd really like to track this down as the time to publish the 4.0 series to the App Store draws near since Xcode13.3 RC has just dropped. A few questions I'd investigate first if I connect. Are these class methods that are not injecting? Do you have the time to try different releases once you are able to replicate the problem. Does version 3.2.1 show this problem? Does 4.1.2 where there were some changes to support injected methods in a superclass. The version before that 4.1.1? https://github.com/johnno1962/InjectionIII/releases

Eric217 commented 2 years ago

1 Not class/static method 2 3.2.1 4.1.2 4.1.1 4.1.6 show the problem

3 Here is the detail log after I update:

final class ZHPageIndicator: UIView {
    private func updateNumberOfPages() {
        // update sth
    } 
}

And save this file won't work; save another file make both work(no need save this file again).

May these info help you.

💉 Compiling /Users/eric/work/template/ZHUIKit/Classes/UIKit/ZHStyleComponents/PageIndicator/PageIndicator.swift
💉 Loading .dylib ...
💉 Loaded .dylib - Ignore any duplicate class warning ⬆️
💉 Sizzled -[ZHUIKit.ZHPageIndicator .cxx_destruct] 0x0000000135b8c930 -> 0x0000000135bbc8e0 @objc ZHUIKit.ZHPageIndicator.__ivar_destroyer $s7ZHUIKit15ZHPageIndicatorCfETo/eval102.dylib 0x135bbc8e0
💉 Sizzled -[ZHUIKit.ZHPageIndicator intrinsicContentSize] 0x0000000135b8aa30 -> 0x0000000135bba9e0 @objc ZHUIKit.ZHPageIndicator.intrinsicContentSize.getter : __C.CGSize $s7ZHUIKit15ZHPageIndicatorC20intrinsicContentSizeSo6CGSizeVvgTo/eval102.dylib 0x135bba9e0
💉 Sizzled -[ZHUIKit.ZHPageIndicator initWithFrame:] 0x0000000135b8c5d0 -> 0x0000000135bbc580 @objc ZHUIKit.ZHPageIndicator.init(frame: __C.CGRect) -> ZHUIKit.ZHPageIndicator $s7ZHUIKit15ZHPageIndicatorC5frameACSo6CGRectV_tcfcTo/eval102.dylib 0x135bbc580
💉 Sizzled -[ZHUIKit.ZHPageIndicator initWithCoder:] 0x0000000135b8c8c0 -> 0x0000000135bbc870 @objc ZHUIKit.ZHPageIndicator.init(coder: __C.NSCoder) -> Swift.Optional<ZHUIKit.ZHPageIndicator> $s7ZHUIKit15ZHPageIndicatorC5coderACSgSo7NSCoderC_tcfcTo/eval102.dylib 0x135bbc870
💉 Sizzled -[ZHUIKit.ZHPageIndicator layoutSubviews] 0x0000000135b8bbf0 -> 0x0000000135bbbba0 @objc ZHUIKit.ZHPageIndicator.layoutSubviews() -> () $s7ZHUIKit15ZHPageIndicatorC14layoutSubviewsyyFTo/eval102.dylib 0x135bbbba0
💉 Patched class 'ZHUIKit.ZHPageIndicator' (0,5)
💉 Interposing 0x000000010bb61520 -> 0x0000000135bb49a0 static ZHUIKit.ZHPageIndicator.Style.__derived_enum_equals(ZHUIKit.ZHPageIndicator.Style, ZHUIKit.ZHPageIndicator.Style) -> Swift.Bool $s7ZHUIKit15ZHPageIndicatorC5StyleO21__derived_enum_equalsySbAE_AEtFZ/eval102.dylib 0x135bb49a0
💉 Interposing 0x000000010bb615d0 -> 0x0000000135bb4a50 ZHUIKit.ZHPageIndicator.Style.hashValue.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC5StyleO9hashValueSivg/eval102.dylib 0x135bb4a50
💉 Interposing 0x000000010bb61650 -> 0x0000000135bb4ad0 ZHUIKit.ZHPageIndicator.Style.hash(into: inout Swift.Hasher) -> () $s7ZHUIKit15ZHPageIndicatorC5StyleO4hash4intoys6HasherVz_tF/eval102.dylib 0x135bb4ad0
💉 Interposing 0x000000010bb61850 -> 0x0000000135bb4cd0 ZHUIKit.ZHPageIndicator.DisplayMode.currentPageColor.getter : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV16currentPageColorSo12ZHColorModelCvg/eval102.dylib 0x135bb4cd0
💉 Interposing 0x000000010bb61880 -> 0x0000000135bb4d00 ZHUIKit.ZHPageIndicator.DisplayMode.currentPageColor.setter : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV16currentPageColorSo12ZHColorModelCvs/eval102.dylib 0x135bb4d00
💉 Interposing 0x000000010bb618c0 -> 0x0000000135bb4d40 ZHUIKit.ZHPageIndicator.DisplayMode.currentPageColor.modify : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV16currentPageColorSo12ZHColorModelCvM/eval102.dylib 0x135bb4d40
💉 Interposing 0x000000010bb618e0 -> 0x0000000135bb4d60 ZHUIKit.ZHPageIndicator.DisplayMode.normalPageColor.getter : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV15normalPageColorSo12ZHColorModelCvg/eval102.dylib 0x135bb4d60
💉 Interposing 0x000000010bb61910 -> 0x0000000135bb4d90 ZHUIKit.ZHPageIndicator.DisplayMode.normalPageColor.setter : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV15normalPageColorSo12ZHColorModelCvs/eval102.dylib 0x135bb4d90
💉 Interposing 0x000000010bb61950 -> 0x0000000135bb4dd0 ZHUIKit.ZHPageIndicator.DisplayMode.normalPageColor.modify : __C.ZHColorModel $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV15normalPageColorSo12ZHColorModelCvM/eval102.dylib 0x135bb4dd0
💉 Interposing 0x000000010bb61990 -> 0x0000000135bb4e10 ZHUIKit.ZHPageIndicator.DisplayMode.currentBorderColor.getter : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV18currentBorderColorSo12ZHColorModelCSgvg/eval102.dylib 0x135bb4e10
💉 Interposing 0x000000010bb619c0 -> 0x0000000135bb4e40 ZHUIKit.ZHPageIndicator.DisplayMode.currentBorderColor.setter : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV18currentBorderColorSo12ZHColorModelCSgvs/eval102.dylib 0x135bb4e40
💉 Interposing 0x000000010bb61a00 -> 0x0000000135bb4e80 ZHUIKit.ZHPageIndicator.DisplayMode.currentBorderColor.modify : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV18currentBorderColorSo12ZHColorModelCSgvM/eval102.dylib 0x135bb4e80
💉 Interposing 0x000000010bb61a40 -> 0x0000000135bb4ec0 ZHUIKit.ZHPageIndicator.DisplayMode.normalBorderColor.getter : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV17normalBorderColorSo12ZHColorModelCSgvg/eval102.dylib 0x135bb4ec0
💉 Interposing 0x000000010bb61a70 -> 0x0000000135bb4ef0 ZHUIKit.ZHPageIndicator.DisplayMode.normalBorderColor.setter : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV17normalBorderColorSo12ZHColorModelCSgvs/eval102.dylib 0x135bb4ef0
💉 Interposing 0x000000010bb61ab0 -> 0x0000000135bb4f30 ZHUIKit.ZHPageIndicator.DisplayMode.normalBorderColor.modify : Swift.Optional<__C.ZHColorModel> $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV17normalBorderColorSo12ZHColorModelCSgvM/eval102.dylib 0x135bb4f30
💉 Interposing 0x000000010bb61ae0 -> 0x0000000135bb4f60 ZHUIKit.ZHPageIndicator.DisplayMode.borderWidth.getter : CoreGraphics.CGFloat $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV11borderWidth12CoreGraphics7CGFloatVvg/eval102.dylib 0x135bb4f60
💉 Interposing 0x000000010bb61af0 -> 0x0000000135bb4f70 ZHUIKit.ZHPageIndicator.DisplayMode.borderWidth.setter : CoreGraphics.CGFloat $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV11borderWidth12CoreGraphics7CGFloatVvs/eval102.dylib 0x135bb4f70
💉 Interposing 0x000000010bb61b00 -> 0x0000000135bb4f80 ZHUIKit.ZHPageIndicator.DisplayMode.borderWidth.modify : CoreGraphics.CGFloat $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV11borderWidth12CoreGraphics7CGFloatVvM/eval102.dylib 0x135bb4f80
💉 Interposing 0x000000010bb61d00 -> 0x0000000135bb5180 ZHUIKit.ZHPageIndicator.DisplayMode.outsideMedia.unsafeMutableAddressor : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV12outsideMediaAEvau/eval102.dylib 0x135bb5180
💉 Interposing 0x000000010bb61d40 -> 0x0000000135bb51c0 static ZHUIKit.ZHPageIndicator.DisplayMode.outsideMedia.getter : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV12outsideMediaAEvgZ/eval102.dylib 0x135bb51c0
💉 Interposing 0x000000010bb62150 -> 0x0000000135bb55d0 ZHUIKit.ZHPageIndicator.DisplayMode.inMedia.unsafeMutableAddressor : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV7inMediaAEvau/eval102.dylib 0x135bb55d0
💉 Interposing 0x000000010bb62190 -> 0x0000000135bb5610 static ZHUIKit.ZHPageIndicator.DisplayMode.inMedia.getter : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV7inMediaAEvgZ/eval102.dylib 0x135bb5610
💉 Interposing 0x0000000135b85780 -> 0x0000000135bb56d0 ZHUIKit.(DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit3DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau/eval102.dylib 0x135bb56d0
💉 Interposing 0x0000000135b857e0 -> 0x0000000135bb5730 ZHUIKit.(MID_DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit7MID_DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau/eval102.dylib 0x135bb5730
💉 Interposing 0x0000000135b85840 -> 0x0000000135bb5790 ZHUIKit.(MIN_DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit7MIN_DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau/eval102.dylib 0x135bb5790
💉 Interposing 0x0000000135b858a0 -> 0x0000000135bb57f0 ZHUIKit.(SPACING3 in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit8SPACING333_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau/eval102.dylib 0x135bb57f0
💉 Interposing 0x0000000135b85900 -> 0x0000000135bb5850 ZHUIKit.(SPACING4 in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit8SPACING433_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau/eval102.dylib 0x135bb5850
💉 Interposing 0x000000010bb62490 -> 0x0000000135bb5970 ZHUIKit.ZHPageIndicator.style.getter : ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5styleAC5StyleOvg/eval102.dylib 0x135bb5970
💉 Interposing 0x000000010bb624f0 -> 0x0000000135bb59d0 ZHUIKit.ZHPageIndicator.style.setter : ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5styleAC5StyleOvs/eval102.dylib 0x135bb59d0
💉 Interposing 0x000000010bb62560 -> 0x0000000135bb5a40 ZHUIKit.ZHPageIndicator.style.modify : ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5styleAC5StyleOvM/eval102.dylib 0x135bb5a40
💉 Interposing 0x000000010bb62900 -> 0x0000000135bb5de0 ZHUIKit.ZHPageIndicator.displayMode.getter : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11displayModeAC07DisplayE0Vvg/eval102.dylib 0x135bb5de0
💉 Interposing 0x000000010bb629e0 -> 0x0000000135bb5ec0 ZHUIKit.ZHPageIndicator.displayMode.setter : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11displayModeAC07DisplayE0Vvs/eval102.dylib 0x135bb5ec0
💉 Interposing 0x000000010bb62ac0 -> 0x0000000135bb5fa0 ZHUIKit.ZHPageIndicator.displayMode.modify : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11displayModeAC07DisplayE0VvM/eval102.dylib 0x135bb5fa0
💉 Interposing 0x000000010bb62c50 -> 0x0000000135bb6130 ZHUIKit.ZHPageIndicator.numberOfPages.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC13numberOfPagesSivg/eval102.dylib 0x135bb6130
💉 Interposing 0x000000010bb62cb0 -> 0x0000000135bb6190 ZHUIKit.ZHPageIndicator.hidesForSinglePage.getter : Swift.Bool $s7ZHUIKit15ZHPageIndicatorC18hidesForSinglePageSbvg/eval102.dylib 0x135bb6190
💉 Interposing 0x000000010bb62d10 -> 0x0000000135bb61f0 ZHUIKit.ZHPageIndicator.hidesForSinglePage.setter : Swift.Bool $s7ZHUIKit15ZHPageIndicatorC18hidesForSinglePageSbvs/eval102.dylib 0x135bb61f0
💉 Interposing 0x000000010bb62d80 -> 0x0000000135bb6260 ZHUIKit.ZHPageIndicator.hidesForSinglePage.modify : Swift.Bool $s7ZHUIKit15ZHPageIndicatorC18hidesForSinglePageSbvM/eval102.dylib 0x135bb6260
💉 Interposing 0x000000010bb62e20 -> 0x0000000135bb6300 ZHUIKit.ZHPageIndicator.currentPage.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC11currentPageSivg/eval102.dylib 0x135bb6300
💉 Interposing 0x000000010bb62e80 -> 0x0000000135bb6360 ZHUIKit.ZHPageIndicator.currentPage.setter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC11currentPageSivs/eval102.dylib 0x135bb6360
💉 Interposing 0x000000010bb63390 -> 0x0000000135bb6870 ZHUIKit.ZHPageIndicator.currentPage.modify : Swift.Int $s7ZHUIKit15ZHPageIndicatorC11currentPageSivM/eval102.dylib 0x135bb6870
💉 Interposing 0x000000010bb63420 -> 0x0000000135bb6900 ZHUIKit.ZHPageIndicator.numberOfPages.setter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC13numberOfPagesSivs/eval102.dylib 0x135bb6900
💉 Interposing 0x000000010bb637c0 -> 0x0000000135bb6ca0 ZHUIKit.ZHPageIndicator.numberOfPages.modify : Swift.Int $s7ZHUIKit15ZHPageIndicatorC13numberOfPagesSivM/eval102.dylib 0x135bb6ca0
💉 Interposing 0x000000010bb67390 -> 0x0000000135bbaa30 ZHUIKit.ZHPageIndicator.intrinsicContentSize.getter : __C.CGSize $s7ZHUIKit15ZHPageIndicatorC20intrinsicContentSizeSo6CGSizeVvg/eval102.dylib 0x135bbaa30
💉 Interposing 0x000000010bb67450 -> 0x0000000135bbaaf0 ZHUIKit.ZHPageIndicator.layoutSubviews() -> () $s7ZHUIKit15ZHPageIndicatorC14layoutSubviewsyyF/eval102.dylib 0x135bbaaf0
💉 Interposing 0x000000010bb69080 -> 0x0000000135bbc8a0 ZHUIKit.ZHPageIndicator.__deallocating_deinit $s7ZHUIKit15ZHPageIndicatorCfD/eval102.dylib 0x135bbc8a0
💉 Interposing 0x0000000108228aa0 -> 0x0000000135bbe930 _ZN5swift34swift50override_conformsToProtocolEPKNS_14TargetMetadataINS_9InProcessEEEPKNS_24TargetProtocolDescriptorIS1_EEPFPKNS_18TargetWitnessTableIS1_EES4_S8_E/eval102.dylib 0x135bbe930
💉 Interposing 0x0000000108228d40 -> 0x0000000135bbebd0 _ZN5swift39swift51override_conformsToSwiftProtocolEPKNS_14TargetMetadataINS_9InProcessEEEPKNS_24TargetProtocolDescriptorIS1_EEN7__swift9__runtime4llvm9StringRefEPFPKNS_35TargetProtocolConformanceDescriptorIS1_EES4_S8_SC_E/eval102.dylib 0x135bbebd0
💉 Interposed static ZHUIKit.ZHPageIndicator.Style.__derived_enum_equals(ZHUIKit.ZHPageIndicator.Style, ZHUIKit.ZHPageIndicator.Style) -> Swift.Bool $s7ZHUIKit15ZHPageIndicatorC5StyleO21__derived_enum_equalsySbAE_AEtFZ
💉 Interposed ZHUIKit.ZHPageIndicator.Style.hashValue.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC5StyleO9hashValueSivg
💉 Interposed ZHUIKit.ZHPageIndicator.Style.hash(into: inout Swift.Hasher) -> () $s7ZHUIKit15ZHPageIndicatorC5StyleO4hash4intoys6HasherVz_tF
💉 Interposed ZHUIKit.ZHPageIndicator.DisplayMode.outsideMedia.unsafeMutableAddressor : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV12outsideMediaAEvau
💉 Interposed ZHUIKit.ZHPageIndicator.DisplayMode.inMedia.unsafeMutableAddressor : ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeV7inMediaAEvau
💉 Interposed ZHUIKit.(DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit3DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau
💉 Interposed ZHUIKit.(MID_DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit7MID_DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau
💉 Interposed ZHUIKit.(MIN_DOT in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit7MIN_DOT33_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau
💉 Interposed ZHUIKit.(SPACING3 in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit8SPACING333_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau
💉 Interposed ZHUIKit.(SPACING4 in _235797CC0DC09B92D856B4149619B3D6).unsafeMutableAddressor : CoreGraphics.CGFloat $s7ZHUIKit8SPACING433_235797CC0DC09B92D856B4149619B3D6LL12CoreGraphics7CGFloatVvau
💉 Interposed ZHUIKit.ZHPageIndicator.numberOfPages.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC13numberOfPagesSivg
💉 Interposed ZHUIKit.ZHPageIndicator.currentPage.getter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC11currentPageSivg
💉 Interposed ZHUIKit.ZHPageIndicator.currentPage.setter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC11currentPageSivs
💉 Interposed ZHUIKit.ZHPageIndicator.numberOfPages.setter : Swift.Int $s7ZHUIKit15ZHPageIndicatorC13numberOfPagesSivs
💉 Interposed ZHUIKit.ZHPageIndicator.intrinsicContentSize.getter : __C.CGSize $s7ZHUIKit15ZHPageIndicatorC20intrinsicContentSizeSo6CGSizeVvg
💉 Interposed ZHUIKit.ZHPageIndicator.layoutSubviews() -> () $s7ZHUIKit15ZHPageIndicatorC14layoutSubviewsyyF
💉 Interposed 16 function references.
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Hashable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESHAAWl/ZHUIKit 0x10bb61610
💉 Reverse interposing 0x000000010bb61610 <- 0x0000000135bb4a90 lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Hashable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESHAAWl/ZHUIKit 0x10bb61610
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySo6UIViewCGSayxGSTsWl/SkeletonView 0x10759c460
💉 Reverse interposing 0x000000010759c460 <- 0x0000000135bbcb80 lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySo6UIViewCGSayxGSTsWl/SkeletonView 0x10759c460
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.EnumeratedSequence<Swift.Array<__C.UIView>> and conformance Swift.EnumeratedSequence<A> : Swift.Sequence in Swift $ss18EnumeratedSequenceVySaySo6UIViewCGGAByxGSTsWl/ZHUIKit 0x10bb69230
💉 Reverse interposing 0x000000010bb69230 <- 0x0000000135bbccb0 lazy protocol witness table accessor for type Swift.EnumeratedSequence<Swift.Array<__C.UIView>> and conformance Swift.EnumeratedSequence<A> : Swift.Sequence in Swift $ss18EnumeratedSequenceVySaySo6UIViewCGGAByxGSTsWl/ZHUIKit 0x10bb69230
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.BinaryInteger in Swift $sS2iSzsWl/AppCloudSDK 0x1062ae730
💉 Reverse interposing 0x00000001062ae730 <- 0x0000000135bbcdb0 lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.BinaryInteger in Swift $sS2iSzsWl/AppCloudSDK 0x1062ae730
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Equatable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESQAAWl/ZHUIKit 0x10bb693d0
💉 Reverse interposing 0x000000010bb693d0 <- 0x0000000135bbceb0 lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Equatable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESQAAWl/ZHUIKit 0x10bb693d0
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Double and conformance Swift.Double : Swift.BinaryFloatingPoint in Swift $sS2dSBsWl/AppCloudSDK 0x1062ae810
💉 Reverse interposing 0x00000001062ae810 <- 0x0000000135bbd730 lazy protocol witness table accessor for type Swift.Double and conformance Swift.Double : Swift.BinaryFloatingPoint in Swift $sS2dSBsWl/AppCloudSDK 0x1062ae810
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.UInt64 and conformance Swift.UInt64 : Swift.FixedWidthInteger in Swift $ss6UInt64VABs17FixedWidthIntegersWl/AppCloudSDK 0x1062ae850
💉 Reverse interposing 0x00000001062ae850 <- 0x0000000135bbd770 lazy protocol witness table accessor for type Swift.UInt64 and conformance Swift.UInt64 : Swift.FixedWidthInteger in Swift $ss6UInt64VABs17FixedWidthIntegersWl/AppCloudSDK 0x1062ae850
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance Swift.Range<A> : Swift.RangeExpression in Swift $sSnySiGSnyxGSXsWl/RxCocoa 0x108f4ae60
💉 Reverse interposing 0x0000000108f4ae60 <- 0x0000000135bbd990 lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance Swift.Range<A> : Swift.RangeExpression in Swift $sSnySiGSnyxGSXsWl/RxCocoa 0x108f4ae60
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance < where A: Swift.Strideable, A.Stride: Swift.SignedInteger> Swift.Range<A> : Swift.Collection in Swift $sSnySiGSnyxGSlsSxRzSZ6StrideRpzrlWl/AppCloudSDK 0x106301550
💉 Reverse interposing 0x0000000106301550 <- 0x0000000135bbdaf0 lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance < where A: Swift.Strideable, A.Stride: Swift.SignedInteger> Swift.Range<A> : Swift.Collection in Swift $sSnySiGSnyxGSlsSxRzSZ6StrideRpzrlWl/AppCloudSDK 0x106301550
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.SignedInteger in Swift $sS2iSZsWl/AppCloudSDK 0x1062ae7c0
💉 Reverse interposing 0x00000001062ae7c0 <- 0x0000000135bbdb60 lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.SignedInteger in Swift $sS2iSZsWl/AppCloudSDK 0x1062ae7c0
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift._ArrayProtocol in Swift $sSaySo6UIViewCGSayxGs14_ArrayProtocolsWl/SkeletonView 0x107594880
💉 Reverse interposing 0x0000000107594880 <- 0x0000000135bbdd40 lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift._ArrayProtocol in Swift $sSaySo6UIViewCGSayxGs14_ArrayProtocolsWl/SkeletonView 0x107594880
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<(offset: Swift.Int, element: __C.UIView)> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySi6offset_So6UIViewC7elementtGSayxGSTsWl/ZHUIKit 0x10bb69eb0
💉 Reverse interposing 0x000000010bb69eb0 <- 0x0000000135bbddd0 lazy protocol witness table accessor for type Swift.Array<(offset: Swift.Int, element: __C.UIView)> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySi6offset_So6UIViewC7elementtGSayxGSTsWl/ZHUIKit 0x10bb69eb0
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.BidirectionalCollection in Swift $sSaySo6UIViewCGSayxGSKsWl/ZHUIKit 0x10ba0d810
💉 Reverse interposing 0x000000010ba0d810 <- 0x0000000135bbdf50 lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.BidirectionalCollection in Swift $sSaySo6UIViewCGSayxGSKsWl/ZHUIKit 0x10ba0d810
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.RangeReplaceableCollection in Swift $sSaySo6UIViewCGSayxGSmsWl/ZHUIKit 0x10bb6a030
💉 Reverse interposing 0x000000010bb6a030 <- 0x0000000135bbdfa0 lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.RangeReplaceableCollection in Swift $sSaySo6UIViewCGSayxGSmsWl/ZHUIKit 0x10bb6a030
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Collection in Swift $sSaySo6UIViewCGSayxGSlsWl/ZHSwiftKit 0x10aa19080
💉 Reverse interposing 0x000000010aa19080 <- 0x0000000135bbe3b0 lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Collection in Swift $sSaySo6UIViewCGSayxGSlsWl/ZHSwiftKit 0x10aa19080
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Dispatch.DispatchWorkItemFlags and conformance Dispatch.DispatchWorkItemFlags : Swift.SetAlgebra in Dispatch $s8Dispatch0A13WorkItemFlagsVACs10SetAlgebraAAWl/AppCloudSDK 0x1062a7f50
💉 Reverse interposing 0x00000001062a7f50 <- 0x0000000135bbe680 lazy protocol witness table accessor for type Dispatch.DispatchWorkItemFlags and conformance Dispatch.DispatchWorkItemFlags : Swift.SetAlgebra in Dispatch $s8Dispatch0A13WorkItemFlagsVACs10SetAlgebraAAWl/AppCloudSDK 0x1062a7f50
💉 Recovered top level variable with private scope lazy protocol witness table accessor for type Swift.Array<Dispatch.DispatchWorkItemFlags> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSay8Dispatch0A13WorkItemFlagsVGSayxGSTsWl/AppCloudSDK 0x1062a7fa0
💉 Reverse interposing 0x00000001062a7fa0 <- 0x0000000135bbe6d0 lazy protocol witness table accessor for type Swift.Array<Dispatch.DispatchWorkItemFlags> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSay8Dispatch0A13WorkItemFlagsVGSayxGSTsWl/AppCloudSDK 0x1062a7fa0
💉 Recovered top level variable with private scope type metadata accessor for __C.UIView $sSo6UIViewCMa/AppCloudSDK 0x10629fba0
💉 Reverse interposing 0x000000010629fba0 <- 0x0000000135bbcac0 type metadata accessor for __C.UIView $sSo6UIViewCMa/AppCloudSDK 0x10629fba0
💉 Recovered top level variable with private scope type metadata accessor for Swift.Array<__C.UIView> $sSaySo6UIViewCGMa/SkeletonView 0x1075948d0
💉 Reverse interposing 0x00000001075948d0 <- 0x0000000135bbcbd0 type metadata accessor for Swift.Array<__C.UIView> $sSaySo6UIViewCGMa/SkeletonView 0x1075948d0
💉 Recovered top level variable with private scope type metadata accessor for Swift.EnumeratedSequence<Swift.Array<__C.UIView>> $ss18EnumeratedSequenceVySaySo6UIViewCGGMa/ZHUIKit 0x10bb69280
💉 Reverse interposing 0x000000010bb69280 <- 0x0000000135bbcd00 type metadata accessor for Swift.EnumeratedSequence<Swift.Array<__C.UIView>> $ss18EnumeratedSequenceVySaySo6UIViewCGGMa/ZHUIKit 0x10bb69280
💉 Recovered top level variable with private scope type metadata accessor for ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5StyleOMa/ZHUIKit 0x10bb696e0
💉 Reverse interposing 0x000000010bb696e0 <- 0x0000000135bbd1e0 type metadata accessor for ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5StyleOMa/ZHUIKit 0x10bb696e0
💉 Recovered top level variable with private scope type metadata accessor for ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeVMa/ZHUIKit 0x10bb69be0
💉 Reverse interposing 0x000000010bb69be0 <- 0x0000000135bbd700 type metadata accessor for ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeVMa/ZHUIKit 0x10bb69be0
💉 Recovered top level variable with private scope type metadata accessor for ZHUIKit.ZHPageIndicator $s7ZHUIKit15ZHPageIndicatorCMa/ZHUIKit 0x10bb69bf0
💉 Reverse interposing 0x000000010bb69bf0 <- 0x0000000135bbd710 type metadata accessor for ZHUIKit.ZHPageIndicator $s7ZHUIKit15ZHPageIndicatorCMa/ZHUIKit 0x10bb69bf0
💉 Recovered top level variable with private scope type metadata accessor for Swift.Range<Swift.Int> $sSnySiGMa/AppCloudSDK 0x1063015c0
💉 Reverse interposing 0x00000001063015c0 <- 0x0000000135bbd9e0 type metadata accessor for Swift.Range<Swift.Int> $sSnySiGMa/AppCloudSDK 0x1063015c0
💉 Recovered top level variable with private scope type metadata accessor for Swift.Array<(offset: Swift.Int, element: __C.UIView)> $sSaySi6offset_So6UIViewC7elementtGMa/ZHUIKit 0x10bb69f00
💉 Reverse interposing 0x000000010bb69f00 <- 0x0000000135bbde20 type metadata accessor for Swift.Array<(offset: Swift.Int, element: __C.UIView)> $sSaySi6offset_So6UIViewC7elementtGMa/ZHUIKit 0x10bb69f00
💉 Recovered top level variable with private scope type metadata accessor for (offset: Swift.Int, element: __C.UIView) $sSi6offset_So6UIViewC7elementtMa/ZHUIKit 0x10bb69f80
💉 Reverse interposing 0x000000010bb69f80 <- 0x0000000135bbdea0 type metadata accessor for (offset: Swift.Int, element: __C.UIView) $sSi6offset_So6UIViewC7elementtMa/ZHUIKit 0x10bb69f80
💉 Recovered top level variable with private scope type metadata accessor for __C.OS_dispatch_queue $sSo17OS_dispatch_queueCMa/AppCloudSDK 0x10628b6a0
💉 Reverse interposing 0x000000010628b6a0 <- 0x0000000135bbe4f0 type metadata accessor for __C.OS_dispatch_queue $sSo17OS_dispatch_queueCMa/AppCloudSDK 0x10628b6a0
💉 Recovered top level variable with private scope type metadata accessor for Swift.Array<Dispatch.DispatchWorkItemFlags> $sSay8Dispatch0A13WorkItemFlagsVGMa/AppCloudSDK 0x1062a7ff0
💉 Reverse interposing 0x00000001062a7ff0 <- 0x0000000135bbe720 type metadata accessor for Swift.Array<Dispatch.DispatchWorkItemFlags> $sSay8Dispatch0A13WorkItemFlagsVGMa/AppCloudSDK 0x1062a7ff0
💉 Reverse interposed type metadata accessor for __C.UIView $sSo6UIViewCMa
💉 Reverse interposed type metadata accessor for Swift.Array<__C.UIView> $sSaySo6UIViewCGMa
💉 Reverse interposed type metadata accessor for Swift.EnumeratedSequence<Swift.Array<__C.UIView>> $ss18EnumeratedSequenceVySaySo6UIViewCGGMa
💉 Reverse interposed type metadata accessor for Swift.Range<Swift.Int> $sSnySiGMa
💉 Reverse interposed type metadata accessor for Swift.Array<(offset: Swift.Int, element: __C.UIView)> $sSaySi6offset_So6UIViewC7elementtGMa
💉 Reverse interposed type metadata accessor for (offset: Swift.Int, element: __C.UIView) $sSi6offset_So6UIViewC7elementtMa
💉 Reverse interposed type metadata accessor for __C.OS_dispatch_queue $sSo17OS_dispatch_queueCMa
💉 Reverse interposed type metadata accessor for Swift.Array<Dispatch.DispatchWorkItemFlags> $sSay8Dispatch0A13WorkItemFlagsVGMa
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Hashable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESHAAWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySo6UIViewCGSayxGSTsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.EnumeratedSequence<Swift.Array<__C.UIView>> and conformance Swift.EnumeratedSequence<A> : Swift.Sequence in Swift $ss18EnumeratedSequenceVySaySo6UIViewCGGAByxGSTsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.BinaryInteger in Swift $sS2iSzsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type ZHUIKit.ZHPageIndicator.Style and conformance ZHUIKit.ZHPageIndicator.Style : Swift.Equatable in ZHUIKit $s7ZHUIKit15ZHPageIndicatorC5StyleOAESQAAWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Double and conformance Swift.Double : Swift.BinaryFloatingPoint in Swift $sS2dSBsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.UInt64 and conformance Swift.UInt64 : Swift.FixedWidthInteger in Swift $ss6UInt64VABs17FixedWidthIntegersWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance Swift.Range<A> : Swift.RangeExpression in Swift $sSnySiGSnyxGSXsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Range<Swift.Int> and conformance < where A: Swift.Strideable, A.Stride: Swift.SignedInteger> Swift.Range<A> : Swift.Collection in Swift $sSnySiGSnyxGSlsSxRzSZ6StrideRpzrlWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Int and conformance Swift.Int : Swift.SignedInteger in Swift $sS2iSZsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift._ArrayProtocol in Swift $sSaySo6UIViewCGSayxGs14_ArrayProtocolsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<(offset: Swift.Int, element: __C.UIView)> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSaySi6offset_So6UIViewC7elementtGSayxGSTsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.BidirectionalCollection in Swift $sSaySo6UIViewCGSayxGSKsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.RangeReplaceableCollection in Swift $sSaySo6UIViewCGSayxGSmsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<__C.UIView> and conformance Swift.Array<A> : Swift.Collection in Swift $sSaySo6UIViewCGSayxGSlsWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Dispatch.DispatchWorkItemFlags and conformance Dispatch.DispatchWorkItemFlags : Swift.SetAlgebra in Dispatch $s8Dispatch0A13WorkItemFlagsVACs10SetAlgebraAAWl
💉 Reverse interposing 8/28 failed for lazy protocol witness table accessor for type Swift.Array<Dispatch.DispatchWorkItemFlags> and conformance Swift.Array<A> : Swift.Sequence in Swift $sSay8Dispatch0A13WorkItemFlagsVGSayxGSTsWl
💉 Reverse interposing 8/28 failed for type metadata accessor for ZHUIKit.ZHPageIndicator.Style $s7ZHUIKit15ZHPageIndicatorC5StyleOMa
💉 Reverse interposing 8/28 failed for type metadata accessor for ZHUIKit.ZHPageIndicator.DisplayMode $s7ZHUIKit15ZHPageIndicatorC11DisplayModeVMa
💉 Reverse interposing 8/28 failed for type metadata accessor for ZHUIKit.ZHPageIndicator $s7ZHUIKit15ZHPageIndicatorCMa
💉 Injected type #1 'ZHUIKit.ZHPageIndicator.Style'
💉 Injected type #2 'ZHUIKit.ZHPageIndicator.DisplayMode'
💉 Injected type #3 'ZHUIKit.ZHPageIndicator'
johnno1962 commented 2 years ago

GM Eric, thanks very much for testing these versions which tells me this is not a regression but something that has never worked. The cause is likely that updateNumberOfPages() is private and the class is final which means interposing is being used and looking at the code I can see why that will fail. To get you up and running can you make the method not private for now and I hope to get back to you later today with a new version catering for this case once I've replicated and can test it.

Eric217 commented 2 years ago

Works without final, whether private or not

johnno1962 commented 2 years ago

Yes, it was the combination of final + private which was provoking this "edge case" (removing the final falls back to function dispatch via the class' "vtable"). I've updated a new release which will interpose private methods. Can you try it please with the original version of your code. https://github.com/johnno1962/InjectionIII/releases/tag/4.1.7

Eric217 commented 2 years ago

Same behavior to 4.1.6, but this time the log shows: 💉 Reverse interposing 0/28 failed (The only apparent diff)

johnno1962 commented 2 years ago

OK, thanks for giving it a try. I'll think about this some more but may have to declare private methods of structs and final classes unsupported for injection which I don't want to do. Can you tell me a little more about your project? updateNumberOfPages() is being called and failing to inject in an extension of ZHPageIndicator in another file until you inject that other file?

Eric217 commented 2 years ago

I find it works!!! and don't need INJECTION_UNHIDE any more :) I've been adding linker flags to app target, this time I add it to this pod target. Seems this issue no longer exists.

Eric217 commented 2 years ago

BTW I'm interested in low level engineering in iOS. Can you please tell me the learning route? e.g. the prerequisite to understand the code in this repo.

BTW ... Since iTunes store is not available in my country, where can I get your book? Thanks.

johnno1962 commented 2 years ago

Here's a couple of pointers: For understanding the codebase, I wrote this document but I can't deny parts of it will be difficult to understand. The fundaments of the techniques I use (interposing, vtables etc.) I tried to lay out in my iBook: https://books.apple.com/us/book/id1551005489 which you'll also find on amazon under the same name.

Eric217 commented 2 years ago

Book name please, I can't open the link

johnno1962 commented 2 years ago

Sorry, it's called "Swift Secrets" amazon/kindle: https://www.amazon.com/Swift-Secrets-Secret-life-runtime-ebook/dp/B08VGKX1FF . Try to avoid getting the paper version as it has a lot of links to articles on the web.

johnno1962 commented 2 years ago

Re: "I find it works!!! and don't need INJECTION_UNHIDE any more" - It patches your projects object files on disk, you'll need it the next time you do a clean build.

johnno1962 commented 2 years ago

Ah, so things are working now you add the -interposable flag to the Pod project? That makes sense. I'll close this tomorrow unless something else crops up. Thanks for your time tracking this down.

Eric217 commented 2 years ago

Re: "I find it works!!! and don't need INJECTION_UNHIDE any more" - It patches your projects object files on disk, you'll need it the next time you do a clean build.

Yes, I forgot the cache🤣

Eric217 commented 2 years ago

Ah, so things are working now you add the -interposable flag to the Pod project? That makes sense. I'll close this tomorrow unless something else crops up. Thanks for your time tracking this down.

👏🏼

Eric217 commented 2 years ago

Sorry, it's called "Swift Secrets" amazon/kindle: https://www.amazon.com/Swift-Secrets-Secret-life-runtime-ebook/dp/B08VGKX1FF . Try to avoid getting the paper version as it has a lot of links to articles on the web.

I give it up 🤣🤣🤣 for my card is not supported on amazon.com, and amazon.cn not vending this book

johnno1962 commented 2 years ago

Hey Eric, I've pushed yet another version https://github.com/johnno1962/InjectionIII/releases/tag/4.1.8 which performs "Unhide on demand". No need to set the INJECTION_UNHIDE variable any more, you'll get the error once which will provoke an unhide asking you to restart rather than performing a full unhide each time you inject.