objc逆アセンブリ解析_strongと_weak
29698 ワード
問題のように逆アセンブリで見てください.strongと_weakの真実の様子、コードの列挙は自然に多くて、紙幅が長くて読むのに不利で、私は先に結論を出して、後ろは分析です.
NON-ARC環境では、_strongと_weakは役に立たない.逆にARC環境では多くのコードが自動的に生成されます.strongと_Weakは、生成ポインタがこのようなC++クラスを参照し、ライフサイクルの役割の範囲(インスタンスとしてのメンバーの場合に広げることができる)を離れる前にプロファイルします.一方、ARCにおけるポインタのデフォルト帯域_strongプロパティ、すなわち_strongはauto reference countを完了しました.疑似コードは次のとおりです.
以下は分析、コードとアセンブリコードの列挙、対比です.
私たちはまず私たちのゲストを招待します.それともa,b,cですか.
aは全局おじいさんで、HP値を無視して、プログラムと同じように長生きします.
bはtagged幽霊で、それは本当に対象のように反応して、あなたが本当にそれが指している土地をはっきり見たいと思っても影が見つかりませんが、それは本当に存在しています.
cは临记で、山の中で芸々众生の1つで、芝居の后で、HPの消耗のため弁当を受け取ります.
それぞれテープを手配しますstrongのsa,sb,sc,および_Weakのwa,wb,wc.
これらの間には、相互に値を割り当てたり、異なる値を与えたり、参照を呼び出したりすることによって、それらは感情的に上演されます.strong&__weak,not Tom&Jerry,お楽しみに、今盛大に開場します.
まず定義を見て、運用プロセス全体を考えてみましょう.
次に、逆アセンブリ比較を開始します.NON-ARC環境では、objcポインタは通常のcポインタと同様に無差別格闘を行います.ポインタは私に直接割り当てられます.strongと_weakは役に立たない.
次に別の環境を分析する.
ARC環境の中で、戦闘は全面的に進級して、各種の華麗な技は次々と現れて、拳は足を来て目の花の獠乱に行きます.
まずa,b,cを見てみましょう.それらはそれらが__であることを示していないがstrong部族か、それとも_Weak連盟は、大きなppをねじっている姿から、骨の中に透けていることを知っています.strongの味.初期値にobjc_を追加しましたretain.もう一つobjc_retainAutoreleaseReturnValueは、autoreleaseに対する名前の戻り値retainのようなものです.
発見おめでとうございますstrong a, b, c!!!
NSString* a = @"abc";
NSString* b = [NSString stringWithUTF8String:"abc"];
NSString* c = [@"ab"stringByAppendingString:@"c"];
何の懸念もないstrong 3人組sa,sb,scは,初期値でもobjc_を用いた.retain.
__strong id sa = a;
__strong id sb = b;
__strong id sc = c;
同じですstrong陣営のa,b,c,sa,sb,scは,objc_を用いて値を割り当てた.storeStrong.彼らの手のひらと手のひらが合った瞬間、aはもう昔のそれをreleaseし、同時に写輪眼retainでsaを落とした.
a = sa;
b = sb;
c = sc;
よくないstrong遭遇上_weak! __weakのwa,wb,wcが次々とマークをつけてobjc_を使いましたinitWeak.a,sb,cに偽装されていますつまり、格納されているアドレスは同じですが、*(int 64*)&a=*(int 64*)&waですが、参照操作は異なります.
__weak id wa = a;
__weak id wb = sb;
__weak id wc = c;
台を回転させないで、宅配便で水道代を払わないでください.strongはまた募集しました._strongのscペア_Weakのwcはretainを直接使うのではなく、_Weakはobjc_を先に使用loadWeakRetained.手に入れたscはすぐにobjc_releaseの古い型は、wcが偽装したエンティティをretainすることができます.
逆に_weakのwcペア_strongのsbは直接objcを出すことができますstoreWeak、そしてsbに偽装しました.
sc = wc;
wc = sb;
wcはそれを使ってちょうど獲得した新しい偽装の型態を使って、scに対してまた招きます、wcはsbの技能を使います-isEqualToString:、結局変化系は直接強化系を使うことができなくて、objc_を通らなければなりませんloadWeakRetainedは転系して、それから大いに飲んで、崩れ落ちた一手-isEqualToString:、一手でscにたたきました.
scは凌波微歩を発揮し、wcを避けようとしたが、手のひらに当たって、wcはYESに戻った.最後にwcはobjc_を使いますreleaseは仕事を収めて散気し,sb型状態から離れた.
[wc isEqualToString:sc];
Autoreleaseがないobjcオブジェクトについて、_strongはobjc_を使いませんretain,
__strong NSString* sx = [[NSString alloc] initWithString:@"abc"];
NSString* x = [[NSString alloc] initWithString:@"abc"];
カーテンコール時には、インスタンスオブジェクトを指すのではなく、__strongおよび__weakの範囲から離れます.それらはc++オブジェクトとして解析された.プロファイルは、上記の偽コードを参照してください.
pointers destructures
花絮送出_weakと_weakのNGクリップ、wbはobjc_を強制的に使用しますloadWeakRetained,waはその正体にobjc_を使うことができるstoreWeak、そしてwbはobjc_を使用しますreleaseはボディスタイルを終了します._Weakはoperator=のオペランドやmsgSendの受信者としてloadWeakRetainedを行わなければならず,終了するとすぐにreleaseする.
wa = wb;
最後に今期の番組を見てくれてありがとう.楽しくて退屈で楽しく見てほしい.見てくれてありがとう.
上一篇:《反汇编objc分析__block》
NON-ARC環境では、_strongと_weakは役に立たない.逆にARC環境では多くのコードが自動的に生成されます.strongと_Weakは、生成ポインタがこのようなC++クラスを参照し、ライフサイクルの役割の範囲(インスタンスとしてのメンバーの場合に広げることができる)を離れる前にプロファイルします.一方、ARCにおけるポインタのデフォルト帯域_strongプロパティ、すなわち_strongはauto reference countを完了しました.疑似コードは次のとおりです.
template<typename _Tptr>
struct __weak
{
_Tptr p;
~__weak()
{
destoryWeak(&p);
}
__weak()
{
p = initWeak(&p, nil);
}
__weak(id newObj)
{
p = initWeak(&p, newObj);
}
__weak(__strong<_Tptr>& other)
{
p = storeWeak(&p, *other);
}
void operator= (__strong<_Tptr>& other)
{
p = storeWeak(&p, *other);
}
void operator= (__weak<_Tptr>& other)
{
id newObj = *other;
p = storeWeak(&p, newObj);
[newObj release];
}
id operator*()
{
return loadWeakRetained(&p);
}
};
template<typename _Tptr>
struct __strong
{
_Tptr p;
~__strong()
{
storeStrong(&p, nil);
}
__strong()
{
p = nil;
}
__strong(id newObj)
{
p = [newObj retain];
}
__strong(__strong<_Tptr>& other)
{
storeStrong(&p, *other);
}
void operator= (__strong<_Tptr>& other)
{
storeStrong(&p, *other);
}
void operator= (__weak<_Tptr>& other)
{
id newObj = *other;
storeStrong(&p, newObj);
[newObj release];
}
id operator* ()
{
return (id)p;
}
};
template<typename _Tptr>
id msgSend(__strong<_Tptr>& strong, SEL sel, ...)
{
return msgSend(*strong, sel, ...);
}
template<typename _Tptr>
id msgSend(__weak<_Tptr>& weak, SEL sel, ...)
{
id receiver = *weak;
id res = msgSend(*weak, sel, ...);
[receiver release];
return res;
}
void storeStrong(id* loc, id newObj)
{
[*loc release];
*loc = [newObj retain];
}
以下は分析、コードとアセンブリコードの列挙、対比です.
私たちはまず私たちのゲストを招待します.それともa,b,cですか.
aは全局おじいさんで、HP値を無視して、プログラムと同じように長生きします.
bはtagged幽霊で、それは本当に対象のように反応して、あなたが本当にそれが指している土地をはっきり見たいと思っても影が見つかりませんが、それは本当に存在しています.
cは临记で、山の中で芸々众生の1つで、芝居の后で、HPの消耗のため弁当を受け取ります.
それぞれテープを手配しますstrongのsa,sb,sc,および_Weakのwa,wb,wc.
これらの間には、相互に値を割り当てたり、異なる値を与えたり、参照を呼び出したりすることによって、それらは感情的に上演されます.strong&__weak,not Tom&Jerry,お楽しみに、今盛大に開場します.
まず定義を見て、運用プロセス全体を考えてみましょう.
-(void)testNSString2
{
NSString* a = @"abc";
NSString* b = [NSString stringWithUTF8String:"abc"];
NSString* c = [@"ab" stringByAppendingString:@"c"];
__strong id sa = a;
__strong id sb = b;
__strong id sc = c;
__weak id wa = a;
__weak id wb = sb;
__weak id wc = c;
sc = wc;
wc = sb;
[wc isEqualToString:sc];
}
次に、逆アセンブリ比較を開始します.NON-ARC環境では、objcポインタは通常のcポインタと同様に無差別格闘を行います.ポインタは私に直接割り当てられます.strongと_weakは役に立たない.
0x1060580d0 <+0>: pushq %rbp
0x1060580d1 <+1>: movq %rsp, %rbp
0x1060580d4 <+4>: subq $0x70, %rsp
0x1060580d8 <+8>: leaq 0x1d90(%rip), %rdx ; "abc"
0x1060580df <+15>: leaq 0x1fda(%rip), %rax ; @"abc"
0x1060580e6 <+22>: movq %rdi, -0x8(%rbp)
0x1060580ea <+26>: movq %rsi, -0x10(%rbp)
-> 0x1060580ee <+30>: movq %rax, -0x18(%rbp)
0x1060580f2 <+34>: movq 0x2e77(%rip), %rax ; (void *)0x000000010636eb20: NSString
0x1060580f9 <+41>: movq 0x2de8(%rip), %rsi ; "stringWithUTF8String:"
0x106058100 <+48>: movq %rax, %rdi
0x106058103 <+51>: callq 0x106058a08 ; symbol stub for: objc_msgSend
0x106058108 <+56>: leaq 0x1fd1(%rip), %rdx ; @"ab"
0x10605810f <+63>: leaq 0x1fea(%rip), %rsi ; @"'c'"
0x106058116 <+70>: movq %rax, -0x20(%rbp)
0x10605811a <+74>: movq 0x2dcf(%rip), %rax ; "stringByAppendingString:"
0x106058121 <+81>: movq %rdx, %rdi
0x106058124 <+84>: movq %rsi, -0x60(%rbp)
0x106058128 <+88>: movq %rax, %rsi
0x10605812b <+91>: movq -0x60(%rbp), %rdx
0x10605812f <+95>: callq 0x106058a08 ; symbol stub for: objc_msgSend
0x106058134 <+100>: movq %rax, -0x28(%rbp)
0x106058138 <+104>: movq -0x18(%rbp), %rax
0x10605813c <+108>: movq %rax, -0x30(%rbp)
0x106058140 <+112>: movq -0x20(%rbp), %rax
0x106058144 <+116>: movq %rax, -0x38(%rbp)
0x106058148 <+120>: movq -0x28(%rbp), %rax
0x10605814c <+124>: movq %rax, -0x40(%rbp)
0x106058150 <+128>: movq -0x18(%rbp), %rax
0x106058154 <+132>: movq %rax, -0x48(%rbp)
0x106058158 <+136>: movq -0x38(%rbp), %rax
0x10605815c <+140>: movq %rax, -0x50(%rbp)
0x106058160 <+144>: movq -0x28(%rbp), %rax
0x106058164 <+148>: movq %rax, -0x58(%rbp)
0x106058168 <+152>: movq -0x58(%rbp), %rax
0x10605816c <+156>: movq %rax, -0x40(%rbp)
0x106058170 <+160>: movq -0x38(%rbp), %rax
0x106058174 <+164>: movq %rax, -0x58(%rbp)
0x106058178 <+168>: movq -0x58(%rbp), %rdi
0x10605817c <+172>: movq -0x40(%rbp), %rax
0x106058180 <+176>: movq 0x2d81(%rip), %rsi ; "isEqualToString:"
0x106058187 <+183>: movq %rax, %rdx
0x10605818a <+186>: callq 0x106058a08 ; symbol stub for: objc_msgSend
0x10605818f <+191>: movb %al, -0x61(%rbp)
0x106058192 <+194>: addq $0x70, %rsp
0x106058196 <+198>: popq %rbp
0x106058197 <+199>: retq
次に別の環境を分析する.
ARC環境の中で、戦闘は全面的に進級して、各種の華麗な技は次々と現れて、拳は足を来て目の花の獠乱に行きます.
まずa,b,cを見てみましょう.それらはそれらが__であることを示していないがstrong部族か、それとも_Weak連盟は、大きなppをねじっている姿から、骨の中に透けていることを知っています.strongの味.初期値にobjc_を追加しましたretain.もう一つobjc_retainAutoreleaseReturnValueは、autoreleaseに対する名前の戻り値retainのようなものです.
発見おめでとうございますstrong
NSString* a = @"abc";
NSString* b = [NSString stringWithUTF8String:"abc"];
NSString* c = [@"ab"stringByAppendingString:@"c"];
-> 0x103658933 <+19>: leaq 0x27e6(%rip), %rdi ; @"abc"
0x10365893a <+26>: movq 0x26f7(%rip), %rsi ; (void *)0x0000000103b6cd00: objc_retain
0x103658941 <+33>: movq %rsi, -0x80(%rbp)
0x103658945 <+37>: callq *%rsi
0x103658947 <+39>: movq %rax, -0x18(%rbp) ; // NSString* a = @"abc";
0x10365894b <+43>: movq 0x3656(%rip), %rdi ; (void *)0x0000000103970b20: NSString
0x103658952 <+50>: movq 0x35c7(%rip), %rsi ; "stringWithUTF8String:"
0x103658959 <+57>: leaq 0x2507(%rip), %rdx ; "abc"
0x103658960 <+64>: movq 0x26c1(%rip), %rax ; (void *)0x0000000103b6f800: objc_msgSend
0x103658967 <+71>: movq %rax, -0x88(%rbp)
0x10365896e <+78>: callq *%rax
0x103658970 <+80>: movq %rax, %rdi
0x103658973 <+83>: callq 0x103659896 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x103658978 <+88>: movq %rax, -0x20(%rbp) ; // NSString* b = [NSString stringWithUTF8String:"abc"];
0x10365897c <+92>: movq 0x35a5(%rip), %rsi ; "stringByAppendingString:"
0x103658983 <+99>: leaq 0x27b6(%rip), %rdi ; @"ab"
0x10365898a <+106>: leaq 0x27cf(%rip), %rdx ; @"'c'"
0x103658991 <+113>: movq -0x88(%rbp), %rax
0x103658998 <+120>: callq *%rax
0x10365899a <+122>: movq %rax, %rdi
0x10365899d <+125>: callq 0x103659896 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x1036589a2 <+130>: movq %rax, -0x28(%rbp) ; // NSString* c = [@"ab" stringByAppendingString:@"c"];
何の懸念もないstrong 3人組sa,sb,scは,初期値でもobjc_を用いた.retain.
__strong id sa = a;
__strong id sb = b;
__strong id sc = c;
0x1036589a6 <+134>: movq -0x18(%rbp), %rdi
0x1036589aa <+138>: movq -0x80(%rbp), %rax
0x1036589ae <+142>: callq *%rax ; objc_retain
0x1036589b0 <+144>: movq %rax, -0x30(%rbp) ; // __strong id sa = a;
0x1036589b4 <+148>: movq -0x20(%rbp), %rdi
0x1036589b8 <+152>: movq -0x80(%rbp), %rax
0x1036589bc <+156>: callq *%rax
0x1036589be <+158>: movq %rax, -0x38(%rbp) ; // __strong id sb = b;
0x1036589c2 <+162>: movq -0x28(%rbp), %rdi
0x1036589c6 <+166>: movq -0x80(%rbp), %rax
0x1036589ca <+170>: callq *%rax
0x1036589cc <+172>: movq %rax, -0x40(%rbp) ; // __strong id sc = c;
同じですstrong陣営のa,b,c,sa,sb,scは,objc_を用いて値を割り当てた.storeStrong.彼らの手のひらと手のひらが合った瞬間、aはもう昔のそれをreleaseし、同時に写輪眼retainでsaを落とした.
a = sa;
b = sb;
c = sc;
0x1036589d0 <+176>: movq -0x30(%rbp), %rsi
0x1036589d4 <+180>: leaq -0x18(%rbp), %rdi
0x1036589d8 <+184>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x1036589dd <+189>: movq -0x38(%rbp), %rsi
0x1036589e1 <+193>: leaq -0x20(%rbp), %rdi
0x1036589e5 <+197>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x1036589ea <+202>: movq -0x40(%rbp), %rsi
0x1036589ee <+206>: leaq -0x28(%rbp), %rdi
0x1036589f2 <+210>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
よくないstrong遭遇上_weak! __weakのwa,wb,wcが次々とマークをつけてobjc_を使いましたinitWeak.a,sb,cに偽装されていますつまり、格納されているアドレスは同じですが、*(int 64*)&a=*(int 64*)&waですが、参照操作は異なります.
__weak id wa = a;
__weak id wb = sb;
__weak id wc = c;
0x1036589f7 <+215>: movq -0x18(%rbp), %rsi
0x1036589fb <+219>: leaq -0x48(%rbp), %rdi
0x1036589ff <+223>: callq 0x103659866 ; symbol stub for: objc_initWeak
0x103658a04 <+228>: movq -0x38(%rbp), %rsi
0x103658a08 <+232>: leaq -0x50(%rbp), %rdi
0x103658a0c <+236>: movq %rax, -0x90(%rbp)
0x103658a13 <+243>: callq 0x103659866 ; symbol stub for: objc_initWeak
0x103658a18 <+248>: movq -0x28(%rbp), %rsi
0x103658a1c <+252>: leaq -0x58(%rbp), %rdx
0x103658a20 <+256>: movq %rdx, %rdi
0x103658a23 <+259>: movq %rax, -0x98(%rbp)
0x103658a2a <+266>: movq %rdx, -0xa0(%rbp)
0x103658a31 <+273>: callq 0x103659866 ; symbol stub for: objc_initWeak
台を回転させないで、宅配便で水道代を払わないでください.strongはまた募集しました._strongのscペア_Weakのwcはretainを直接使うのではなく、_Weakはobjc_を先に使用loadWeakRetained.手に入れたscはすぐにobjc_releaseの古い型は、wcが偽装したエンティティをretainすることができます.
逆に_weakのwcペア_strongのsbは直接objcを出すことができますstoreWeak、そしてsbに偽装しました.
sc = wc;
wc = sb;
0x103658a36 <+278>: movq -0xa0(%rbp), %rdi
0x103658a3d <+285>: movq %rax, -0xa8(%rbp)
0x103658a44 <+292>: callq 0x10365986c ; symbol stub for: objc_loadWeakRetained
0x103658a49 <+297>: movq -0x40(%rbp), %rdi
0x103658a4d <+301>: movq %rax, -0x40(%rbp)
0x103658a51 <+305>: movq 0x25d8(%rip), %rax ; (void *)0x0000000103b6cd70: objc_release
0x103658a58 <+312>: callq *%rax
0x103658a5a <+314>: movq -0x38(%rbp), %rsi
0x103658a5e <+318>: movq -0xa0(%rbp), %rdi
0x103658a65 <+325>: callq 0x1036598a8 ; symbol stub for: objc_storeWeak
wcはそれを使ってちょうど獲得した新しい偽装の型態を使って、scに対してまた招きます、wcはsbの技能を使います-isEqualToString:、結局変化系は直接強化系を使うことができなくて、objc_を通らなければなりませんloadWeakRetainedは転系して、それから大いに飲んで、崩れ落ちた一手-isEqualToString:、一手でscにたたきました.
scは凌波微歩を発揮し、wcを避けようとしたが、手のひらに当たって、wcはYESに戻った.最後にwcはobjc_を使いますreleaseは仕事を収めて散気し,sb型状態から離れた.
[wc isEqualToString:sc];
0x103658a6a <+330>: movq -0xa0(%rbp), %rdi
0x103658a71 <+337>: movq %rax, -0xb0(%rbp)
0x103658a78 <+344>: callq 0x10365986c ; symbol stub for: objc_loadWeakRetained
0x103658a7d <+349>: movq %rax, %rdx
0x103658a80 <+352>: movq -0x40(%rbp), %rsi
0x103658a84 <+356>: movq 0x34b5(%rip), %rdi ; "isEqualToString:"
0x103658a8b <+363>: movq %rdi, -0xb8(%rbp)
0x103658a92 <+370>: movq %rax, %rdi
0x103658a95 <+373>: movq -0xb8(%rbp), %rax
0x103658a9c <+380>: movq %rsi, -0xc0(%rbp)
0x103658aa3 <+387>: movq %rax, %rsi
0x103658aa6 <+390>: movq -0xc0(%rbp), %rcx
0x103658aad <+397>: movq %rdx, -0xc8(%rbp)
0x103658ab4 <+404>: movq %rcx, %rdx
0x103658ab7 <+407>: movq -0x88(%rbp), %r8
0x103658abe <+414>: callq *%r8
0x103658ac1 <+417>: movb %al, -0xc9(%rbp)
0x103658ac7 <+423>: jmp 0x103658acc ; <+428> at ViewController.m:100
0x103658acc <+428>: movq 0x255d(%rip), %rax ; (void *)0x0000000103b6cd70: objc_release
0x103658ad3 <+435>: movq -0xc8(%rbp), %rdi
0x103658ada <+442>: callq *%rax
Autoreleaseがないobjcオブジェクトについて、_strongはobjc_を使いませんretain,
__strong NSString* sx = [[NSString alloc] initWithString:@"abc"];
0x103658adc <+444>: movq 0x34c5(%rip), %rdi ; (void *)0x0000000103970b20: NSString
0x103658ae3 <+451>: movq 0x345e(%rip), %rsi ; "alloc"
0x103658aea <+458>: movq 0x2537(%rip), %rax ; (void *)0x0000000103b6f800: objc_msgSend
0x103658af1 <+465>: callq *%rax
0x103658af3 <+467>: movq %rax, -0xd8(%rbp)
0x103658afa <+474>: jmp 0x103658aff ; <+479> at ViewController.m:102
0x103658aff <+479>: movq 0x344a(%rip), %rsi ; "initWithString:"
0x103658b06 <+486>: leaq 0x2613(%rip), %rdx ; @"abc"
0x103658b0d <+493>: movq 0x2514(%rip), %rax ; (void *)0x0000000103b6f800: objc_msgSend
0x103658b14 <+500>: movq -0xd8(%rbp), %rdi
0x103658b1b <+507>: callq *%rax
0x103658b1d <+509>: movq %rax, -0xe0(%rbp)
0x103658b24 <+516>: jmp 0x103658b29 ; <+521> at ViewController.m:102
0x103658b29 <+521>: movq -0xe0(%rbp), %rax
0x103658b30 <+528>: movq %rax, -0x70(%rbp)
NSString* x = [[NSString alloc] initWithString:@"abc"];
0x103658b34 <+532>: movq 0x346d(%rip), %rdi ; (void *)0x0000000103970b20: NSString
0x103658b3b <+539>: movq 0x3406(%rip), %rsi ; "alloc"
0x103658b42 <+546>: movq 0x24df(%rip), %rcx ; (void *)0x0000000103b6f800: objc_msgSend
0x103658b49 <+553>: callq *%rcx
0x103658b4b <+555>: movq %rax, -0xe8(%rbp)
0x103658b52 <+562>: jmp 0x103658b57 ; <+567> at ViewController.m:103
0x103658b57 <+567>: movq 0x33f2(%rip), %rsi ; "initWithString:"
0x103658b5e <+574>: leaq 0x25bb(%rip), %rdx ; @"abc"
0x103658b65 <+581>: movq 0x24bc(%rip), %rax ; (void *)0x0000000103b6f800: objc_msgSend
0x103658b6c <+588>: movq -0xe8(%rbp), %rdi
0x103658b73 <+595>: callq *%rax
0x103658b75 <+597>: movq %rax, -0xf0(%rbp)
0x103658b7c <+604>: jmp 0x103658b81 ; <+609> at ViewController.m:103
0x103658b89 <+617>: movq -0xf0(%rbp), %rdx
0x103658b90 <+624>: movq %rdx, -0x78(%rbp)
カーテンコール時には、インスタンスオブジェクトを指すのではなく、__strong
pointers destructures
0x103658b81 <+609>: xorl %eax, %eax
0x103658b83 <+611>: movl %eax, %esi
0x103658b85 <+613>: leaq -0x78(%rbp), %rcx
0x103658b94 <+628>: movq %rcx, %rdi
0x103658b97 <+631>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658b9c <+636>: xorl %eax, %eax
0x103658b9e <+638>: movl %eax, %esi
0x103658ba0 <+640>: leaq -0x70(%rbp), %rcx
0x103658ba4 <+644>: movq %rcx, %rdi
0x103658ba7 <+647>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658bac <+652>: leaq -0x58(%rbp), %rdi
0x103658bb0 <+656>: callq 0x103659860 ; symbol stub for: objc_destroyWeak
0x103658bb5 <+661>: leaq -0x50(%rbp), %rdi
0x103658bb9 <+665>: callq 0x103659860 ; symbol stub for: objc_destroyWeak
0x103658bbe <+670>: leaq -0x48(%rbp), %rdi
0x103658bc2 <+674>: callq 0x103659860 ; symbol stub for: objc_destroyWeak
0x103658bc7 <+679>: leaq -0x40(%rbp), %rdi
0x103658bcb <+683>: xorl %eax, %eax
0x103658bcd <+685>: movl %eax, %esi
0x103658bcf <+687>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658bd4 <+692>: leaq -0x38(%rbp), %rdi
0x103658bd8 <+696>: xorl %eax, %eax
0x103658bda <+698>: movl %eax, %esi
0x103658bdc <+700>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658be1 <+705>: leaq -0x30(%rbp), %rdi
0x103658be5 <+709>: xorl %eax, %eax
0x103658be7 <+711>: movl %eax, %esi
0x103658be9 <+713>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658bee <+718>: xorl %eax, %eax
0x103658bf0 <+720>: movl %eax, %esi
0x103658bf2 <+722>: leaq -0x28(%rbp), %rcx
0x103658bf6 <+726>: movq %rcx, %rdi
0x103658bf9 <+729>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658bfe <+734>: xorl %eax, %eax
0x103658c00 <+736>: movl %eax, %esi
0x103658c02 <+738>: leaq -0x20(%rbp), %rcx
0x103658c06 <+742>: movq %rcx, %rdi
0x103658c09 <+745>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658c0e <+750>: xorl %eax, %eax
0x103658c10 <+752>: movl %eax, %esi
0x103658c12 <+754>: leaq -0x18(%rbp), %rcx
0x103658c16 <+758>: movq %rcx, %rdi
0x103658c19 <+761>: callq 0x1036598a2 ; symbol stub for: objc_storeStrong
0x103658c1e <+766>: addq $0xf0, %rsp
0x103658c25 <+773>: popq %rbp
0x103658c26 <+774>: retq
花絮送出_weakと_weakのNGクリップ、wbはobjc_を強制的に使用しますloadWeakRetained,waはその正体にobjc_を使うことができるstoreWeak、そしてwbはobjc_を使用しますreleaseはボディスタイルを終了します._Weakはoperator=のオペランドやmsgSendの受信者としてloadWeakRetainedを行わなければならず,終了するとすぐにreleaseする.
wa = wb;
0x10c47bb51 <+609>: leaq -0x50(%rbp), %rdi
0x10c47bb60 <+624>: callq 0x10c47c86c ; symbol stub for: objc_loadWeakRetained
0x10c47bb65 <+629>: leaq -0x48(%rbp), %rdi
0x10c47bb69 <+633>: movq %rax, %rsi
0x10c47bb6c <+636>: movq %rax, -0xf8(%rbp)
0x10c47bb73 <+643>: callq 0x10c47c8a8 ; symbol stub for: objc_storeWeak
0x10c47bb78 <+648>: movq -0xf8(%rbp), %rdi
0x10c47bb7f <+655>: movq %rax, -0x100(%rbp)
0x10c47bb86 <+662>: callq 0x10c47c87e ; symbol stub for: objc_release
最後に今期の番組を見てくれてありがとう.楽しくて退屈で楽しく見てほしい.見てくれてありがとう.
上一篇:《反汇编objc分析__block》