インテリジェントポインタとocのポインタ
2851 ワード
インテリジェントポインタとocのポインタ
インテリジェントポインタの原理と実現クラスにポインタメンバーがある場合、一般的にポインタメンバーを管理する方法は2つあります.1つは値型の方法で管理し、各クラスオブジェクトはポインタが指すオブジェクトのコピーを保持します.もう1つのより優雅な方法は、スマートポインタを使用して、ポインタが指すオブジェクトの共有を実現することです.
インテリジェントポインタ(smart pointer)の一般的な実装技術の1つは、参照カウント(reference count)を使用することである.インテリジェントポインタクラスは、クラスが指すオブジェクトにカウンタを関連付け、参照カウントは、クラスが同じポインタを共有するオブジェクトがどれだけあるかを追跡します.
クラスの新しいオブジェクトを作成するたびに、ポインタを初期化し、参照カウントを1にします.オブジェクトが別のオブジェクトのコピーとして作成されると、構造関数のコピーポインタをコピーし、それに対応する参照数を増加させる.オブジェクトに値を割り当てると、値オペレータは左オペランドが指すオブジェクトの参照カウントを減らし(参照カウントが0に減少するとオブジェクトを削除)、右オペランドが指すオブジェクトの参照カウントを増やします.構造関数を呼び出すと、構造関数は参照カウントを減らします(参照カウントが0に減少すると、ベースオブジェクトが削除されます).
スマートポインタ:
@interface Quotation:NSObject
{
NSString *id;
NSString *name;
NSString *price;
Account *account;
}
ocのオブジェクトでは、メンバーはポインタで、id、name、price属性、クラスオブジェクトはそれぞれのメモリを維持しますが、account属性では、多くの場合、quotationオブジェクトがaccountを共有している場合が多く、スマートポインタを使用する必要があります.
たとえば
{
Quotation *quotation1 =[ [Quotation alloc] init];
quotation1.name = @"gold";
quotation1.price = @"12.7";
Quotation *quotation2 =[ [Quotation alloc] init];
quotation2.name = @"dollor";
quotation2.price = @"12.2";
}
quotion 1とquotion 2のpriceポインタは、1つのメモリを共有せず、それぞれのメモリを維持します.
次の場合は、スマートポインタを使用するとよいでしょう.
{
Account *currAccount = self.account;
Quotation *quotation1 =[ [Quotation alloc] init];
quotation1.account = account;
Quotation *quotation2 =[ [Quotation alloc] init];
quotation2.account = currAccount;
[currAccount release];
//上記の場合、quotationクラスのaccount属性がretainではなく、通常のassign付与である場合:
quotion 1、quotion 2のaccountは同じメモリを指しています.quotion 1がaccountメモリを解放した場合、quotion 2のaccountは野ポインタです.accountが指すメモリがquotion 1によって解放されたからです.この場合、quotion 2はaccountを使用してcrashになります.この場合、スマートポインタで防ぐ必要があります.
果quotationクラスのaccount属性がretainである場合:
[currAccount release]//currAccountはreleaseされていますが、currAccountはquotion 1オブジェクトに一度保持されているため、currAccountは解放されていません.currAccountが解放された場合、彼も解放されるとは限りません.quotion 2はまたそれを保持しているので、currAccountの参照カウンタが0の場合にのみ解放されます.ocでは、retain属を設定することで性はスマートポインタの応用である.quotion 1はquotion 2オブジェクトとメモリcurrAccountを共有している.参照カウンタによって共有メモリの解放の問題を解決する.
}
このことから,oc中のポインタはretain属性であればスマートポインタであり,カウンタを参照することでポインタが指すオブジェクトの共有を実現する.最終制御ポインタが指すメモリの解放.
ocでは、delegateオブジェクト(ループ参照を防止するため)を除いて、基本的にすべてのオブジェクトがretain(またはstrong)プロパティです.
ocでは、オブジェクトがretainスマートポインタではなく、通常のポインタを使用すると、あるオブジェクトが共有メモリを解放し、別のオブジェクトがこのメモリを再使用するときにcrashという問題が発生します.
ocのメモリ管理はリファレンスカウンタ,すなわちスマートポインタ管理を用いる.スマートポインタの役割は、retainCountが0の場合にのみ共有メモリを解放する共有メモリの解放を管理することです.
インテリジェントポインタの原理と実現クラスにポインタメンバーがある場合、一般的にポインタメンバーを管理する方法は2つあります.1つは値型の方法で管理し、各クラスオブジェクトはポインタが指すオブジェクトのコピーを保持します.もう1つのより優雅な方法は、スマートポインタを使用して、ポインタが指すオブジェクトの共有を実現することです.
インテリジェントポインタ(smart pointer)の一般的な実装技術の1つは、参照カウント(reference count)を使用することである.インテリジェントポインタクラスは、クラスが指すオブジェクトにカウンタを関連付け、参照カウントは、クラスが同じポインタを共有するオブジェクトがどれだけあるかを追跡します.
クラスの新しいオブジェクトを作成するたびに、ポインタを初期化し、参照カウントを1にします.オブジェクトが別のオブジェクトのコピーとして作成されると、構造関数のコピーポインタをコピーし、それに対応する参照数を増加させる.オブジェクトに値を割り当てると、値オペレータは左オペランドが指すオブジェクトの参照カウントを減らし(参照カウントが0に減少するとオブジェクトを削除)、右オペランドが指すオブジェクトの参照カウントを増やします.構造関数を呼び出すと、構造関数は参照カウントを減らします(参照カウントが0に減少すると、ベースオブジェクトが削除されます).
スマートポインタ:
, ,
, , , , , , , 1, 0, 0 , !
@interface Quotation:NSObject
{
NSString *id;
NSString *name;
NSString *price;
Account *account;
}
ocのオブジェクトでは、メンバーはポインタで、id、name、price属性、クラスオブジェクトはそれぞれのメモリを維持しますが、account属性では、多くの場合、quotationオブジェクトがaccountを共有している場合が多く、スマートポインタを使用する必要があります.
たとえば
{
Quotation *quotation1 =[ [Quotation alloc] init];
quotation1.name = @"gold";
quotation1.price = @"12.7";
Quotation *quotation2 =[ [Quotation alloc] init];
quotation2.name = @"dollor";
quotation2.price = @"12.2";
}
quotion 1とquotion 2のpriceポインタは、1つのメモリを共有せず、それぞれのメモリを維持します.
次の場合は、スマートポインタを使用するとよいでしょう.
{
Account *currAccount = self.account;
Quotation *quotation1 =[ [Quotation alloc] init];
quotation1.account = account;
Quotation *quotation2 =[ [Quotation alloc] init];
quotation2.account = currAccount;
[currAccount release];
//上記の場合、quotationクラスのaccount属性がretainではなく、通常のassign付与である場合:
quotion 1、quotion 2のaccountは同じメモリを指しています.quotion 1がaccountメモリを解放した場合、quotion 2のaccountは野ポインタです.accountが指すメモリがquotion 1によって解放されたからです.この場合、quotion 2はaccountを使用してcrashになります.この場合、スマートポインタで防ぐ必要があります.
果quotationクラスのaccount属性がretainである場合:
[currAccount release]//currAccountはreleaseされていますが、currAccountはquotion 1オブジェクトに一度保持されているため、currAccountは解放されていません.currAccountが解放された場合、彼も解放されるとは限りません.quotion 2はまたそれを保持しているので、currAccountの参照カウンタが0の場合にのみ解放されます.ocでは、retain属を設定することで性はスマートポインタの応用である.quotion 1はquotion 2オブジェクトとメモリcurrAccountを共有している.参照カウンタによって共有メモリの解放の問題を解決する.
}
このことから,oc中のポインタはretain属性であればスマートポインタであり,カウンタを参照することでポインタが指すオブジェクトの共有を実現する.最終制御ポインタが指すメモリの解放.
ocでは、delegateオブジェクト(ループ参照を防止するため)を除いて、基本的にすべてのオブジェクトがretain(またはstrong)プロパティです.
ocでは、オブジェクトがretainスマートポインタではなく、通常のポインタを使用すると、あるオブジェクトが共有メモリを解放し、別のオブジェクトがこのメモリを再使用するときにcrashという問題が発生します.
ocのメモリ管理はリファレンスカウンタ,すなわちスマートポインタ管理を用いる.スマートポインタの役割は、retainCountが0の場合にのみ共有メモリを解放する共有メモリの解放を管理することです.