8

保持したいすべてのインスタンス変数をプライベート プロパティに変換することになっているのでしょうか、それとも明らかな何かが欠けているのでしょうか?

@interface SomethingElse : Something  {

    NSMutableArray *someArray;

}

この例では、someArray は [NSMutableArray initWithObject:someObject] を使用してメソッドで初期化されますが、保持されません。

私の特定の状況は、ゲームを更新していることです。多くのインスタンス変数があるため、SDK の将来のバージョンのために、これを正しく行っていることを確認したいと考えています。

4

6 に答える 6

19

保持したいすべてのローカル変数をプライベート プロパティに変換することになっているのでしょうか、それとも明らかな何かが欠けているのでしょうか?

まず、例で示した変数はインスタンス変数であり、ローカル変数ではありません。ローカル変数は、コードのブロック内 (関数やメソッド内、または条件ステートメントの本体などのサブブロック内など) で宣言され、宣言されたブロックの実行に限定された有効期間があります。 . インスタンス変数はクラスで宣言されます。そのクラスの各インスタンスは、クラスによって宣言されたインスタンス変数の独自のコピーを取得します。

次に、いいえ、すべてのインスタンス変数をプロパティに変換する必要はありません。ARC では、インスタンス変数はデフォルトで強参照として扱われます。プロパティは実際には、クラスが特定のアクセサーに特定のセマンティクスを提供するという単なる約束です。インスタンス変数があるからといって、その ivar にアクセサーを提供する必要があるわけではありません。(そうすべきだと言う人もいるかもしれませんが、そうする必要はありません。)

于 2012-07-03T16:12:03.793 に答える
3

@property は、オブジェクトに強いデフォルトのストレージ修飾子以外を使用しない限り、インスタンス変数と同じです。@property (copy) NSString *s;たとえば、インスタンス変数を使用し、変数を設定するたびに copy を呼び出すことを忘れないでください。または @property を使用します (こちらの方が簡単です) 。

于 2012-07-03T16:12:32.333 に答える
1

他のコメントのいくつかでBAD_ACCESSの問題について説明しています。ここで何か他のことが起こっています。ARCでは、他に資格がない限り、ivarは強力です(ARC以外では、ivarはユーザーに代わってリリースされることはありません)。

たとえば、このARCコードは正常に機能し、他の回答へのコメントで報告するときにBAD_ACCESSはありません。

@interface ArcTestViewController ()
{
    NSMutableArray *_someArray;
}
@end

@implementation ArcTestViewController

- (void)dealloc
{
    _someArray = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _someArray = [[NSMutableArray alloc] initWithObjects:@"Mo", @"Larry", @"Curly", nil];
}

- (IBAction)checkIvarTouchUpInside:(id)sender 
{
    NSLog(@"%s _someArray = %@", __FUNCTION__, _someArray);
}

@end

BAD_ACCESSは別のものでなければならないため、BAD_ACCESSを取得している例を示す必要がある場合があります。

「プロパティ」または「ivar」の質問に答えて、「常にプロパティを使用する」という議論に共感しますが、個人的には、外部アクセサーを提供する必要があるものすべてにプロパティを使用し、それ以外の場合はプライベートivarを使用します( .hですが、.mファイルのプライベートインターフェイスにあります)。これにより、.hファイル内のパブリックインターフェイスが非常にクリーンになり、数か月後に戻ったときに理解しやすくなります。「常にプロパティを使用する」アプローチを採用する場合は、それらのプロパティの公開宣言をできるだけ制限することをお勧めします(可能な場合はプロパティを非公開にし、そうでない場合はプロパティの公開宣言を読み取り専用にします)読み取り/書き込みアクセスなどを提供する必要はありません)。

ちなみに、Cocoaのコーディングガイドラインの名前付けプロパティとデータ型は、ベストプラクティスの良いリファレンスです。

于 2012-07-03T17:44:41.960 に答える
1

の ARC バージョンはretainと呼ばれstrongます。

基本的に、次のようなものを使用して宣言します。

@property (strong) NSMutableArray *someArray;

詳細については、「strong」キーワードの機能を参照してください。

一般に、ローカル変数の代わりにプロパティを使用することをお勧めします。これは、プロパティが「無料」でアクセサー/セッターを取得し、一般的に使いやすいためです。

于 2012-07-03T16:02:30.330 に答える
0

ご回答ありがとうございます。

オブジェクトを必要とするメソッドを (cocos2d ゲーム エンジン メソッドを使用して) 呼び出す場合:

[self schedule:@selector(someMethod) interval:3.0];

cocos2d スケジューラーに配置せずに直接呼び出すと、オブジェクトは逆参照されます。

[self someMethod];

その後、まだ有効なポインターがあります。テストのためだけに、私はそれを保持し、残ります。

そこで問題は、ARC が保持を終了したと考えて解放するのを防ぐために、どのように保持を強制するかということです。

インスタンス変数をプライベート プロパティに変更すると安全に変更できるため、これを答えとして使用します。

于 2012-07-05T16:30:24.987 に答える
0

Obj-C 2.0 以降では、iVar を使用する理由はほとんどないようです。私は個人的に永遠に1つを使用していません。プロパティはあなたのためにすべてを行います!

于 2012-07-03T16:07:46.590 に答える