1

最初のアプリを完成させようとしていますが、非常に基本的なメモリ管理についてはまだ混乱しています。ここの多くの投稿とアップルのドキュメントを読みましたが、まだ戸惑っています。たとえば、私はm現在、プログラムでラベルを追加するために次のようなことを行っています。

@property (retain, nonatomic) UILabel *showTime;
@sythesize showTime;

showTime = [[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)];
[self.showTime setText:[NSString stringWithFormat:@"%d", time]];
[self.showTime setFont:[UIFont fontWithName:@"HelveticaRoundedLT-Bold" size:23]];
[self.showTime setTextColor:numColor];
self.showTime.backgroundColor = [UIColor clearColor];
[self addSubview:self.showTime];
[showTime release];

これは私の現在の慣習であり、UILabel、UIButton、UIImageViewなどです... [Alloc init]自己なしで。、cozこれは2回保持されることを知っています。しかし、割り当て後、「自己」を元に戻します。属性を設定します。

私の腸の感覚は私が間違っていることを教えてくれますが、それは表面的には機能し、分析と機器でメモリリークは見つかりませんでした..誰かが私のアドバイスを与えることができますか?「自分」を使うとき。テキストと背景色を設定するために、自動的に保持されますか?THXそんなに!

4

2 に答える 2

1

実際、任意の要素にプロパティを与えると、それが意味することは、その要素に自動ゲッター/セッターを提供することです。

 @property (retain, nonatomic) UILabel *showTime;
 @synthesize showTime;

ここで、これらのゲッター/セッターにアクセスするには、要素をselfで初期化する必要があります。

したがって、常に行います、

 self.showTime = [[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)];

2回保持しているため、割り当てられたオブジェクトを自動解放モードのままにします。

 self.showTime = [[[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)] autorelease];

さて、たとえば値を与えたり、背景色を変更したりするためにオブジェクトを取得したい場合は、

 [self.showTime setText:[NSString stringWithFormat:@"%d", time]];

また

 [showTime setText:[NSString stringWithFormat:@"%d", time]];

何でもいいでしょう。

ただし、DEALLOCセクションでは、nilに設定するために自分自身が必要です。

 self.showTime = nil;

実際、retainプロパティは、次のようなsetterメソッドを生成します。

 - (void)setShowTime:(UILabel *)label {
     if (showTime != label) {
         [showTime release];
         showTime = [label retain];
     }
 }

したがって、メモリの変更、つまりALLOCationまたはDeallocationを処理する場合は、SELFを使用します。

しかし、これは自己の使い方についての私の理解です。他のアイデアは、いつでも歓迎します!

それが役に立てば幸い!!!!

于 2012-10-08T14:06:01.653 に答える
1

「retain」属性を持つプロパティを作成するときはいつでも、「self」ポインタを使用してプロパティ自体を設定します(これは、テキストやフォントなどのプロパティの一部の側面を設定することとは異なります)。保持カウントが追加されます。ただし、テキスト、フォント、textColorなどを設定するときのように、単にアクセスしたときに保持カウントが追加されることはありません。また、自分でメモしたように、保持カウントが追加されることもありません。インスタンス変数を直接設定します(selfポインターを省略します)。

ここに表示されている最後の行に到達するまでに、「showTime」の保持カウントは1になります。

保持#1 =[UILabel alloc]

Retain#2 = [self addSubview:self.showTime];(そして、明確にするaddSubviewために、この場合、保持カウントを追加しているのはメソッド呼び出しです...self.showTimeアクセサーではありません)。

[showTime release]保持カウントの1つを削除するため、1つが残ります。

ラベルに再度アクセスする場合を除いて、テキストやフォントなどを変更するために、プロパティを作成する必要はほとんどありません。

于 2012-10-08T14:09:07.630 に答える