1

私はObjective-Cを初めて使用します。これが私の最初の投稿です。データベースへのアプリケーションインターフェイスを管理する目的でシングルトンを作成しました。簡単に始めるために、私はNSMutableArrayをivarとして使用しました。以下のコードとログ出力に示されているように、NSMutableArrayオブジェクトに割り当てられる前の保持カウントは0であり、割り当て後の保持カウントは2です。

なぜこれが起こるのかわかりません。[NSMutableArray arrayWithObject:(id)]が保持カウントが1のオブジェクトを作成し、代入self.dataListが保持カウントをインクリメントするためですか?リリースを一度呼び出すのは安全ですか?それは正しいことではないようです。

これがソースです

#import <Foundation/Foundation.h>


@interface DataInterfaceObject : NSObject {
    NSMutableArray *dataList;

}

@property (nonatomic, retain) NSMutableArray *dataList;

+ (id) sharedAlloc;

@end

..。

#import "DataInterface.h"

static DataInterfaceObject *sharedDataInterfaceObject = nil;

@implementation DataInterfaceObject

@synthesize dataList;

+ (id) sharedAlloc {    
    @synchronized(self) {
        if (sharedDataInterfaceObject == nil) 
            sharedDataInterfaceObject = [super alloc];
    }
    return sharedDataInterfaceObject;
}

+ (id) alloc {
    return [[self sharedAlloc] init];
}

- (id)init 
{
    @synchronized(self) {
        NSLog(@"In DataInterface init 1, RetainCount for dataList is %d", [self.dataList retainCount]);
        if (dataList == nil) {
            self = [super init];
            if (self) {
                //Instantiate list
                NSLog(@"In DataInterface init 2, RetainCount for dataList is %d", [self.dataList retainCount]);
                self.dataList = [NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa", @"Tour Eiffel", @"Ball", @"Lettuce", nil];
                NSLog(@"In DataInterface init 3, RetainCount for dataList is %d", [self.dataList retainCount]);
            }
        }
    }
    return self;
}

- (void)dealloc 
{
    [dataList release];
    [super dealloc];
}

@end

ログには次の情報が表示されます。

2011-04-06 21:18:26.931 jobs[11672:207] initislized
2011-04-06 21:18:26.933 jobs[11672:207] In DataInterface init 1, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 2, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 3, RetainCount for dataList is 2
4

3 に答える 3

4

デバッグに保持カウントを使用しないでください。気が狂います。メモリ リークや過剰解放に問題がある場合は、メモリ管理規則に従っていることを確認してください。

ココアコアコンピテンシー

Cocoa With Love には、 Cocoa でのシングルトンの作成に関する優れた記事があります。

于 2011-04-07T04:56:39.897 に答える
4

コード:

[NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa",
    @"Tour Eiffel", @"Ball", @"Lettuce", nil];

将来いつか解放される、保持カウントが 1 の自動解放変数を作成します。プロパティは保持も呼び出すため、print ステートメントが呼び出されたときにオブジェクトの保持カウントが 2 になり、すぐに 1 に減少します。

于 2011-04-07T04:59:30.757 に答える
2

はい、2 つにまっすぐ進む理由は、a) オブジェクトを作成し、b) オブジェクトを self.dataList に割り当てて保持するためです。ただし、+alloc を呼び出さなかったので、オブジェクトの作成については責任を負わないため、-dealloc で dataList を 1 回だけ解放しても問題ありません。

そうは言っても、@Terry Wilcox は正しいです。-retainCount を見ないでください。

于 2011-04-07T05:00:17.433 に答える