ARCメカニズム
5016 ワード
ARCとは Automatic Reference Counting、自動参照カウント.すなわちARC. 名前の通り:システムは自動的にオブジェクトの参照カウンタの値を計算するのに役立ち、 はWWDC 2011とiOS 5が導入した最大の変革と最も感動的な変化と言える. ARCは新しいLLVM 3である.0コンパイラの1つの特性、ARCを使って、広大なiOSが憎む手動でメモリを管理する面倒を一挙に解決したと言える. プログラムでARCを使用するのは非常に簡単で、いつものようにコードを書くだけです. ただretain、release、autoreleaseの3つのキーワードを永遠に書かないでください、これはARCの最も基本的な原則です.ARCがオンになると、コンパイラはretain、release、autorelaseコードを自動的に適切な場所に挿入する.
コンパイラは自動的にオブジェクトの参照カウントを行う.開発者としては、開発者自身がARCを誤用しない限り、コンパイラが間違ってしまう心配は全くない. 特に注意すべきことは、ARCはコンパイラ機構である.コンパイラがコードをコンパイルするとき、retain、release、autorealseコードを適時に追加する. . ARCメカニズムでは、オブジェクトがいつ解放されるか このオブジェクトに強いポインタがない限り、そのオブジェクトは直ちに回収される.
強ポインタと弱ポインタ. 強ポインタ:デフォルトでは、1つのポインタというポインタが1つの強ポインタであることを宣言します. も使えます_strongが表示する声明は強いポインタです. Person *p1; これは強いポインタです.ポインタのデフォルトはいずれも1つの強いポインタである. __strong Person *p2; これも強いポインタです.使用__strongは強いポインタを表示します.
弱ポインタ:使用_Weak標識のポインタを弱ポインタと呼ぶ. 強いポインタも弱いポインタも、ポインタであり、アドレスを格納するために使用できる点には何の違いもありません. は、このポインタを介してオブジェクトのメンバーにアクセスすることができる. 唯一の違いはARCモードである.彼らは回収対象の基準として用いる. 1オブジェクトに強いタイプのポインタがない場合、オブジェクトは自動的に解放されます.
プログラムがARCメカニズムを起動するかどうかを確認する. のデフォルトでは、XcodeはARCメカニズムをオンにする. ARCメカニズムでは、retain、relase、retainCount、autoreleaseメソッドの呼び出しは許可する. deallocでは[super dealloc];
ARC下の単一オブジェクトのメモリ管理. オブジェクトを指すすべての強いポインタが回収すると、オブジェクトは直ちに回収される.
オブジェクトを指すすべての強いポインタをnilに付与とき.対象は直ちに回収される. .最も重要な1点:オブジェクトを作成することはできません.このオブジェクトのポインタを1つの弱いポインタで格納します. このようにすると、作成されたばかりのオブジェクトは、何の強いポインタも指し示すことなく、作成すると回収される.
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1 1 .
// , 1 1 .
NSLog(@"------");
}// .p1 , Person
// . .
return 0;
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1 1 .
Person *p2 = p1;//p2 .p1 p2 Person .
// , 1 1 .
NSLog(@"------");
}// .p1 ,p2 . Person
// . .
return 0;
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1 1 .
// , 1 1 .
p1 = nil;// .p1 nil.
//p1 Person .
//Person , .Person .
NSLog(@"------");
}
return 0;
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{
// 1 , 1
// .
// .
__weak Person *p1 = [[Person alloc] init];
}
return 0;
}