2

私は主に C++ 開発者で、最近は iPhone アプリケーションを作成しています。

iPhone でのメモリ管理は問題ありません。リソースの制限により、ディープ コピーではなく参照カウンターを使用することをお勧めします。

面倒なことの 1 つは、参照カウンターを自分で管理する必要があることです。alloc はカウンター = 1 を意味します。保持はカウンター++を意味し、リリースはカウンター--を意味します

Cocoa Touch 用に shared_ptr のようなクラスを作成したいので、自分で参照カウンターを手動で操作する必要はほとんどありません。

そのための既存のコードがあるかどうか疑問に思っています。アドバイスを聞きたいのですが、Objective C を学び始めてから今日で 5 日目です。

ありがとう。

4

5 に答える 5

1

iOS 5 で導入される自動参照カウントにより、objective-c オブジェクトへのポインターはすべてスマート ポインターのように機能します。Retain/release 呼び出しは、明示的に弱い参照を宣言しない限り、割り当てと割り当て解除時にコンパイラによって合成されます。その場合、オブジェクトの割り当てが解除されると、それらは自動的にゼロになります。

私のアドバイスは、そのために数ヶ月待つことです. それまでの間、似たようなものをまとめることができるかもしれませんが、私はそれをお勧めしません. 一つには、それは醜いでしょう。例:

 smart_ptr<id> array = make_smart_ptr( [NSMutableArray array] );

 NSUInteger count = [array count];            // won't work.
 count = [array.get() count];                 // works, but yuck.
 [array.get() setArray: anotherArray.get()];  // even more yuck.

また、ヘッダーが C++ クラスでいっぱいの場合、プロジェクト全体を Objective-C++ でコンパイルする必要があります。 -party フレームワークはそれで適切に動作します。コードを他の人と共有することは忘れてください。

このようなものを作るのは面白い練習になるかもしれませんが、実際に使いたいとは思わないでしょう。また、Objective-C でお気に入りの C++ を再作成したいという誘惑に気をつけてください。言語は大きく異なり、それを行うのに多くの時間を費やすことができます。つまり、C++ では実行できない、Objective-C で実行できるすべての優れた機能を学習するのに費やす時間ではありません。

于 2011-07-08T17:58:55.967 に答える
1

最初にメモリ管理規則を学習する限り、実際の問題はありshared_ptrません。C++ のコンテキストでは役立ちますが、所有権に関する質問が魔法のように消えることはありません。
shared_ptrカスタム デロケーターをサポートしているため、次のようになります。

@interface A : NSObject
- (void)f;
@end

@implementation A
- (void)dealloc { NSLog(@"bye"); [super dealloc]; }
- (void)f { NSLog(@"moo"); }
@end

void my_dealloc(id p) {
    [p release];
}

// ...
{
    shared_ptr<A> p([[A alloc] init], my_dealloc);
    [p.get() f];
}

... 出力:

ムーバイ
_

... 予想通り。

必要に応じて、ヘルパー関数を使用してユーザーからデロケーターを非表示にすることができます。

template<class T> shared_ptr<T> make_objc_ptr(T* t) {
    return shared_ptr<T>(t, my_dealloc);
}

shared_ptr<A> p = make_objc_ptr<A>([[A alloc] init]);
于 2010-07-22T18:27:44.553 に答える
1

ケース4を忘れた

[4] メソッドからオブジェクトへのポインタを戻り値として渡す必要があります。

これは、-autorelease が必要な場所です。

この小さなプロジェクトを試す前に、メモリ管理のルールを読み、実際のコードを書いて、メモリ管理がどのように機能するかを理解することをお勧めします。

于 2010-07-22T14:16:51.360 に答える
0

調べたことがあり[object autorelease]ますか?おそらくそれは物事を少し簡単にするでしょう。

于 2010-07-22T14:23:50.217 に答える
0

Cocoa でのリソース管理には注意が必要です。API 呼び出しによって参照が自動的に保持されるものと保持されないもの、自動解放されたオブジェクトを返すもの、保持されたオブジェクトを返すものがあります。これを shared_ptr クラスでシールドすると、間違いを犯す可能性が高くなります。私のアドバイスは、かなり経験を積むまでは、まず「通常の」Cocoa ルートを取ることです。

于 2010-07-22T12:03:21.800 に答える