рдбрд┐рдмрдЧрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдПрдЖрд░рд╕реА рдмрд░рдХрд░рд╛рд░

рдХрднреА-рдХрднреА рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдорд╛рдирдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрдкрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИрдУрдПрд╕ 4.1 рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдФрд░ рд▓рд╛рдпрди x86_64 рдФрд░ iOS 5 рдореЗрдВ, рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдпрд╣ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рд╣реИ (рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ
рджреЛрд╖)ред

рдПрдЖрд░рд╕реА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ:

- (id) retain { // Break here to see who is retaining me. return [super retain]; } 



рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓реИрдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рд╣реИрдХ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрди рдЧрдпрд╛ред

рд╡рд┐рдиреНрдпрд╛рд╕:
рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо: рд╢реЗрд░ x64_86
Xcode: 4.2.1 4D502
рдХреНрд▓реИрдВрдЧ: 318.0.58 i686

1. рд╕рдВрдХрд▓рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ

 $ clang --version Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn) ... 

2. Apple Open Source рд╕реЗ рд╣рдорд╛рд░реЗ рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдирд┐рдХрд╛рд▓реЗрдВ

http://opensource.apple.com/tarballs/
рджрдмрдВрдЧ /

рдпрд╣ рдЖрдкрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЕрдиреБрдорд╛рдирд┐рдд, рдмреЗрд╣рддрд░ рдЬреЛ рдирдпрд╛ рд╣реИред

 $ tar xzvf clang-318.0.45.tar.gz 

3. рдкреИрдЪ рджрдмрд╛рдирд╛

рдЕрдкрдиреЗ objc_retain1 рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдХреЙрд▓ рдХреЛ objc_retain рдореЗрдВ рдмрджрд▓реЗрдВред

 clang-318.0.45/src/tools/clang/lib/CodeGen/CGObjC.cpp:1554 > "objc_retain1"); 

4. рд╣рдо рдХреНрд▓реИрдВрдЧ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ

 make RC_ProjectSourceVersion=1 RC_OS=macos RC_ARCHS=i686 TARGETS=i686 SRCROOT=`pwd` OBJROOT=`pwd`/build/obj DSTROOT=`pwd`/build/dst SYMROOT=`pwd`/build/sym 

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЕрдзрд┐рдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред

 chown: src/apple-gcc/1/clang-318.0.45/build/obj/stage1-install-x86_64/lib/c++: Operation not permitted make[4]: *** [do-installhdrs] Error 1 ... make[1]: *** [install] Error 1 

рдпрд╣ рдареАрдХ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ - рдореБрдЦреНрдп рдЪреАрдЬ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рд╣реИ рдФрд░ рд╡реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред

 build/obj/stage1-install-x86_64/bin/clang 

Apple рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ, рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕рд╣реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
рд╢рд╛рдпрдж рдирд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ build_gcc рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХрд░рдирд╛ рдкрдбрд╝рд╛
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдмрд╛рдж рд╕реНрдерд╛рдкрдирд╛)ред

рдЪреЗрддрд╛рд╡рдиреА! рдпрджрд┐ рдЖрдк README.TXT рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ gcc рдпрд╛ llvm-gcc рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рдореВрд▓ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ / рдХреА рдПрдХ рдмреИрдХрдЕрдк рдкреНрд░рддрд┐ рдмрдирд╛рдиреА рд╣реЛрдЧреА
рдбреЗрд╡рд▓рдкрд░ / рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо / iPhoneSimulator.platform / рдбреЗрд╡рд▓рдкрд░ / usr /ред
рдХреНрд▓реИрдВрдЧ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╣реИ
рд╕рдВрд╕реНрдХрд░рдг clang-318.0.45)ред

5. рджрдмрдВрдЧ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

рд╣рдо рдореВрд▓ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХреЛ рдПрдХ рдирдП (рдХреЗрд╡рд▓ рд╕рд┐рдорд▓рд┐рдВрдХ) рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА
рдбреЗрд╡рд▓рдкрд░ / usr рдФрд░ stage1-install-x86_64 /) рдореЗрдВ рдЕрдВрддрд░ред

 $ cd /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin $ mv clang clang.orig $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang 

рд╣реЛ рдЧрдпрд╛ред рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрд▓реИрдВрдЧ рдХреЗ 2 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрдирдореЛрджрд┐рдд (рдмрд┐рдирд╛)
рдкреИрдЪ 3) - рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░
рд╕рдВрд╢реЛрдзрд┐рдд - рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдореЗрдВ рд╣рдо ARC рдХреЛ рдбрд┐рдмрдЧ рдХрд░реЗрдВрдЧреЗред рдЪреБрдирдирд╛
Xcode рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

 #   $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang #  ,     clang.new $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang.new clang 

рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдм рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди objc_retain1 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рд╛ рд╣реИ
(рдкреНрд░рд┐рдВрдЯреНрд╕ рдмреИрдХрдЯреНрд░реЗрд╕):

 id objc_retain(id o); void *objc_retain1(void *o) { static void *b[10]; static int z = 10; static int n; static char **c; n = backtrace(b, z); c = backtrace_symbols(b, n); NSLog(@"objc_retain(%p):", o); for (int i = 0; i < n; i++) { NSLog(@"%s", c[i]); } return (__bridge void *)objc_retain((__bridge id)o); } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдк рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЫреЛрдЯреА рд╡рд╕реНрддреБ рдЪреЛрд░реЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ
рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ (рдореВрд▓ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ)ред
рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░
рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧред

CGObjC.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреНрдп ARC рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
(рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдЖрд░рд╕реА рдХреА рдЖрдВрддрд░рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
рдПрдЖрд░рд╕реА рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ:
http://clang.llvm.org/
рдбреЙрдХреНрд╕ / AutomaticReferenceCounting.html

* рдкрде рдПрд╕рдбреАрдХреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/In148099/


All Articles