рдХрднреА-рдХрднреА рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдорд╛рдирдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрдкрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИрдУрдПрд╕ 4.1 рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ
рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдФрд░ рд▓рд╛рдпрди x86_64 рдФрд░ iOS 5 рдореЗрдВ, рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдпрд╣ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рд╣реИ (рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ
рджреЛрд╖)ред
рдПрдЖрд░рд╕реА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ:
- (id) 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 рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдм рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред
рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди 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* рдкрде рдПрд╕рдбреАрдХреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ