0

iOSプログラミングとメモリ管理全般に比較的慣れていないスタッフがたくさんいます。保持カウントを示すいくつかのラベルと、それらの保持カウントをインクリメントおよびデクリメントするためのいくつかのボタンを備えたアプリを作成したいと思います。

誰かがすでにうまくいく何かを知っているか、それが私の主張を理解するようにこれを設定することについて何かアドバイスがありますか?動作するバージョンがありますが、思ったとおりに動作していないようです。

ViewController.h

#import <UIKit/UIKit.h>

@interface MemoryTestingViewController : UIViewController {
    UILabel *retainCount;
    UILabel *descLabel;
    UIButton *addRetain;
    UIButton *addRelease;
    UIButton *access;

    NSMutableString *myString;
}

@property (nonatomic, retain) IBOutlet UILabel *retainCount;
@property (nonatomic, retain) IBOutlet UILabel *descLabel;
@property (nonatomic, retain) IBOutlet UIButton *addRetain;
@property (nonatomic, retain) IBOutlet UIButton *addRelease;
@property (nonatomic, retain) IBOutlet UIButton *access;

@property (nonatomic, retain) NSMutableString *myString;

-(IBAction)pressedRetain:(id)sender;
-(IBAction)pressedRelease:(id)sender;
-(IBAction)pressedAccess:(id)sender;

@end



ViewController.m

-(IBAction)pressedAccess:(id)sender {

    descLabel.text = @"Accessing myString, did we crash";
    myString = [NSMutableString stringWithFormat:@"Accessing myString"];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
}

-(IBAction)pressedRetain:(id)sender {

    descLabel.text = @"Adding 1 to retain count for myString";
    [myString retain];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
}

-(IBAction)pressedRelease:(id)sender {

    descLabel.text = @"Adding 1 release to myString";
    [myString release];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];

}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    // init our variable string
    myString = [[NSString alloc] init];
    descLabel.text = @"myString retain count after alloc/init";

    // fill our label with myString's retain count starting out
    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
    [super viewDidLoad];
}

これを実行すると問題ないように見えますが、保持ボタンを押そうとするとクラッシュします。誰かがこれを少しきれいにする方法について何かアドバイスがあれば、私はそれをいただければ幸いです。理想的には、保持カウントがゼロに達してアプリがクラッシュしたときにアクセスボタンを押してもらいたいのですが、保持カウントが1以上であれば、アクセスボタンは機能するはずです。ありがとう。

4

2 に答える 2

4

retainCountオブジェクトのはトリッキーなビジネスです。

このパスを続行する場合は、次の詳細に注意する必要があります。

  • retainCount0を返すことはできません
  • ダングリングポインタのメッセージングは​​、クラッシュすることが保証されていません
  • 実装の詳細により、システムAPIを介してオブジェクトを渡した後は、保持カウントを知ることはできません。
  • システムクラスのサブクラスは、実装の詳細により、保持カウントが不明である可能性があります
  • 保持カウントは、オブジェクトが自動解放されるかどうかを反映することはありません
  • 自動リリースは事実上スレッド固有ですが、保持カウントはスレッドグローバルです
  • 一部のクラスは、シングルトンで実装される場合があります(NSString、NSNumberの特定の値)
  • 実装の詳細はプラットフォームごとに、リリースごとに変わります
  • 一部のクラスは保持カウントを維持するためにこれらのメソッドを実際に使用しないため、スウィズルしようとすると機能しません(実装の詳細、プラットフォームretain/リリースごとの変更など)。releaseautorelease

保持/解放を教える場合は、保持カウントをデルタとして扱い、「RCを増やす場合は、減らす必要がある」ことに完全に焦点を当てる必要があります。

于 2011-10-11T15:00:54.960 に答える
3

retainCount信頼性が低いことで有名であり、返される値は非常に奇妙な場合があります。この投稿をチェックしてください:

于 2011-10-11T14:19:33.223 に答える