2

これ:

    UILable *myLabel = [[UILabel alloc] init];
    UILable *myLabel = [[UILabel alloc] init];

再定義エラーが発生します。

でもこれは:

    for(i=0;i<5;i++)
    { 
       UILable *myLabel = [[UILabel alloc] init];
       // some label code here
       [self.view addSubview:myLabel];
       [myLabel release];
    }

しません。では、2番目は偽ですか?前に定義して再利用する必要がありますか?

そうですか:

 UIIMageView *Sign;
//Some Sign Stuff
     Sign = [[UIImageView alloc]init];
        Sign.image = [UIImage imageNamed:@"Minus.png"]; 
        frame = CGRectMake(160 ,80, 64, 64);
        Sign.frame = frame;
        [scrollView addSubview:Sign];
        Sign = nil;
        [Sign release];
//Some other Sign stuff
     Sign = [[UIImageView alloc]init];
        Sign.image = [UIImage imageNamed:@"Plus.png"];  
        frame = CGRectMake(200 ,80, 64, 64);
        Sign.frame = frame;
        [scrollView addSubview:Sign];
        Sign = nil;
        [Sign release];

あれは正しいですか?Sign = nil なしでは機能しません。そのため、少しぐらつくようにも見えます。

4

2 に答える 2

1

同じブロック レベル スコープで同じ変数名を使用することはできません。したがって、最初の例では、同じ名前の変数定義を持つことはできません。別の名前を付ける必要があります。

- (void) method {
   UIImageView* image1;

   // here we define a new block scope. This can be a block of any kind (while, for, if)
   {
      // All reference in this block to this variable will see this definition.
      UIImageView* image1;

      // Using image1 here
   }

   // Here we see again the image1 defined at the beginning of the method.
}

ループの例では、各反復後に再初期化される新しいスコープにいます。

3 番目の例は、変数を 1 回だけ定義するという点で正しいです。その後、この変数を再利用して、新しいオブジェクトを割り当てます。3番目のものは、変数名がそれぞれのケースの目的をうまく説明していないという点でエレガントではありません。

'Sign = nil' の場合、Objective-C では nil オブジェクトに送信されたメッセージは無視されるため、これは実質的に次の行を役に立たなくします。

同じように見える画像を作成するために呼び出すことができるメソッドを定義することをお勧めします。何かのようなもの:

- (void) createImage:(NSString*) image frame:(CGRect) frame {
  UIImageView *Sign;
  Sign = [[UIImageView alloc]init];
  Sign.image = [UIImage imageNamed:image]; 
  Sign.frame = frame;
  [self.scrollView addSubview:Sign];
  [Sign release];
}
于 2009-09-30T12:08:50.427 に答える
0

あなたの for ループはまったく問題ありません。myLabel のスコープは、for ループの 1 回の実行に限定されます。したがって、実行するたびに、UILabel への参照を保持する新しい変数が作成されます。

投稿した 2 番目のコードにはリークがあります。

Sign = nil
[Sign release]

これにより、作成したオブジェクトではなく、アドレス nil のオブジェクトが解放されます。あなたのコードに他に何が問題があるのか​​ わかりませんが、あなたの修正は根本的な原因を修正していません. Sign = nil を削除するときに発生するエラー/警告を投稿すると役立つ場合があります。

また、通常、クラス名は大文字で始まるため、変数名を大文字で始めることは適切な命名規則ではないことに注意してください。

于 2009-09-30T12:09:20.713 に答える