1

クラスのインスタンスごとに1回だけ初期化されるNSArrayなどのプロパティがある場合、これに何か問題がありますか。

(インターフェース内)

@property(strong, nonatomic)NSArray *bubbleArr;

(実装中)

-(NSArray*)bubbleArr
{
    if(!bubbleArr)
    {
        NSMutableArray *tempBubbArr = [[NSMutableArray alloc] init];
        // get filepath for first speech bubble image for page
        NSString *speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
                                         [NSString stringWithFormat:@"speech_%i_0", pageIndex]
                                                                        ofType:@"png"];

        for(int i = 1; speechBubbleImgPath; i++)
        {
            UIImage *speechBubbleImg = [[UIImage alloc] initWithContentsOfFile:speechBubbleImgPath];
            UIImageView *speechBubbleImgView = [[UIImageView alloc] initWithImage:speechBubbleImg];

            [tempBubbArr addObject:speechBubbleImgView];

            speechBubbleImg = nil;
            speechBubbleImgView = nil;
            speechBubbleImgPath = nil;

            speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
                                   [NSString stringWithFormat:@"speech_%i_%i", pageIndex, i]
                                                                  ofType:@"png"];
        }

        bubbleArr = [[NSArray alloc] initWithArray:tempBubbArr];

        tempBubbArr = nil;
    }

    return bubbleArr;
}

カスタムアクセサメソッドを使用したことはありませんが、これは設定するためのクリーンな方法のように思われるため、自分viewDidLoadや他の場所で各プロパティを設定する必要はなく、それがであるかどうかを心配する必要もありませんnil。これを行うコードに実際に出くわしたことはありません。これはそれを行うための推奨される方法ですか?また、私は常にself.bubbleArrこのメソッドが呼び出されることを確認するために使用したいと思いますよね?

4

4 に答える 4

2

これはあなたの財産を設定する完全に有効な方法です。Appleは、サンプルコードとプロジェクトテンプレートでこの種のことを頻繁に行っています。たとえば、新しく作成されたコアデータiOSプロジェクトのコアデータスタックの設定を見てください。@WendiKiddが指摘したように、これがうまく機能することを確認するために、常にアクセサーを介して変数にアクセスする必要があります(これはおそらくとにかく行うべきことです)。

特に、これは、実際には1つのものしか返すことができないクラスのプロパティを実装するための優れた方法です(コメントから、これはあなたがやろうとしていることのように聞こえます)。それがあなたの目標である場合、従うべきいくつかのガイドラインがあります:

  1. あなたの財産を次のように宣言しますreadonly
  2. パブリックにアクセスできる必要がある場合はパブリックヘッダーで、「プライベート」である必要がある場合は.mファイルのクラス拡張子で宣言します。
  3. 変数でバックアップできる/バックアップする必要がある場合は、ivarを合成し、実行したようにゲッターを上書きします
  4. 変数でバックアップする必要がない/必要がない場合は@dynamic、実装のようにプロパティを宣言し、ゲッターを上書きします
  5. アクセサーを介してのみivarにアクセスします

4番目のポイントで変数を動的として宣言すると、コードを見るすべての人に、そのプロパティのカスタムアクセサーを作成した可能性があることを通知します。

于 2012-05-28T22:25:50.227 に答える
1

変数の内容を初期化する必要があるまで待機する手法は「遅延読み込み」と呼ばれ、有効な手法です。ただし、ゲッター内でそれを行うかどうかはわかりません。

問題は投稿の最後の行で正確に説明されていると思います。そうです。クラス自体の内部であっても、オブジェクトを参照する場合は、必ずgetterメソッドを呼び出す必要があります。間違いを犯しやすく、それを適切に行わないと、将来、コードが別の開発者に渡される可能性がある場合は特に悪い考えです。彼らは、あなたがこのように設定したことを絶対に期待するつもりはなく、通常どおり変数にアクセスできることを期待すると、問題が発生する可能性があります。viewDidLoad内でメンバー変数を初期化することは、一般的で受け入れられている方法です。

そうです-これは技術的には可能ですが、設計的にはあまり適切な設定ではありません。私はそれに対して強くお勧めします。しかし、それが機能するかどうかを単に知りたいのであれば、答えはイエスです。

于 2012-05-28T22:22:03.990 に答える
0

はい、self.bubbleArrayまたは[selfbubbleArray]を使用しない場合、そのメソッドを呼び出すことはありません。

それ以外は、プロパティのインスタンス化を管理するための完全に優れた方法です。

于 2012-05-28T22:23:40.537 に答える
0

クリーンなソリューションのようで、遅延読み込みのように感じます。しかし、私はこのようにするかどうかはわかりません。

于 2012-05-28T22:23:48.323 に答える