0

シングルトンNSMutableArrayを実行しようとしていますが、count関数は常に0要素を表示します。オブジェクトをうまく受け取っていないと思います。

これは私が作成したコードです。

//VariableStore.h
@interface VariableStore : NSObject
{
    NSMutableArray *pruebaGlobal;
}
@property (nonatomic, retain) NSMutableArray *pruebaGlobal;
+ (VariableStore *)sharedInstance;
- (NSMutableArray*)pruebaGlobal;
@end

//VariableStore.m
@implementation VariableStore
@synthesize pruebaGlobal;
+ (VariableStore *)sharedInstance
{
    // the instance of this class is stored here
    static VariableStore *myInstance = nil;

    // check to see if an instance already exists
    if (nil == myInstance) {
        myInstance  = [[[self class] alloc] init];
        myInstance.pruebaGlobal = [[NSMutableArray alloc] initWithCapacity:100];
    }
    // return the instance of this class
    return myInstance;
}

- (NSMutableArray*)pruebaGlobal{
    return pruebaGlobal;
}

@end

//ViewController.m

NSMutableArray *p = [[VariableStore sharedInstance] pruebaGlobal];
p = [NSArray arrayWithObjects:
                   [NSMutableArray arrayWithObjects:@"Sí", @"No", nil, nil, nil],
                   [NSMutableArray arrayWithObjects:@"Súbita", @"Fluctuante", @"Progresiva", nil, nil],
nil];

NSLog(@"%d", [[[VariableStore sharedInstance] pruebaGlobal] count]);
4

3 に答える 3

1

配列の構築内での誤用は別としてnil、コードは、カウントを取得している配列に何も追加しません。これを試して:

NSMutableArray *p = [[VariableStore sharedInstance] pruebaGlobal];
[p addObject:[NSMutableArray arrayWithObjects:@"Sí", @"No", [NSNull null], [NSNull null], nil]];
[p addObject:[NSMutableArray arrayWithObjects:@"Súbita", @"Fluctuante", @"Progresiva", [NSNull null], nil]];

合成するプロパティについては、保持プロパティとして指定してから、セッターではなくゲッターを明示的に定義します。プロパティを保持済みとして宣言する場合は、コンパイラにgetterとsetterの両方を処理させるか、どちらか一方だけでなく、両方を自分で作成することができます。私の提案で- (NSMutableArray*)pruebaGlobalは、ヘッダーファイルと実装ファイルから明示的なgetter:を削除するだけです。

于 2013-02-03T20:41:23.180 に答える
0

コードのこの部分には、少なくとも 2 つの問題があります。

NSMutableArray *p = [[VariableStore sharedInstance] pruebaGlobal];
p = [NSArray arrayWithObjects:
               [NSMutableArray arrayWithObjects:@"Sí", @"No", nil, nil, nil],
               [NSMutableArray arrayWithObjects:@"Súbita", @"Fluctuante", @"Progresiva", nil, nil], nil];

最初 :[NSMutableArray arrayWithObjects:@"Sí", @"No", nil, nil, nil]
arrayWithObjectsオブジェクトのみを受け取ることができnil、拡張のリストを終了するために使用されるオブジェクトではありません。の概念を に挿入する場合nilは、その用途のために特別に存在するシングルトン オブジェクトをNSArray挿入する必要があります。[NSNull null]

その他の問題は、の使用ですp : pruebaGlobal
への参照を取得し、ポインターの内容を別の新しい配列のアドレスに置き換えます。だから今別のオブジェクトを指している.NSMutableArraypppruebaGlobal

これを修正する方法は次のようになります。

NSMutableArray *p = [[VariableStore sharedInstance] pruebaGlobal];  
[p addObject:@"test object"];
NSLog(@"%d", [[[VariableStore sharedInstance] pruebaGlobal] count]);

これで、カウントが 1 になるはずです。

于 2013-02-03T20:35:50.590 に答える
0

問題は、プロパティの合成 ivar の名前が_pruebaGlobal. しかし、あなたのpruebaGlobalメソッドはpruebaGlobalivar を返しています。

コードは次のように更新する必要があります。

//VariableStore.h
@interface VariableStore : NSObject

@property (nonatomic, retain) NSMutableArray *pruebaGlobal;

+ (VariableStore *)sharedInstance;
- (NSMutableArray*)pruebaGlobal;

@end

//VariableStore.m
@implementation VariableStore

+ (VariableStore *)sharedInstance {
    // the instance of this class is stored here
    static VariableStore *myInstance = nil;

    // check to see if an instance already exists
    if (nil == myInstance) {
        myInstance  = [[[self class] alloc] init];
        myInstance.pruebaGlobal = [[NSMutableArray alloc] initWithCapacity:100];
    }

    // return the instance of this class
    return myInstance;
}

@end

@synthesize最新の Objective-C コンパイラ (Xcode 4.4 以降) では、ivar や行はもう必要ありません。どちらも生成されます。

メソッドを実装する必要はありませんpruebaGlobal。合成されます。

問題の残りの半分は、プロパティpに影響を与えない変数にまったく新しい配列を割り当てることです。pruebaGlobal必要にp応じて、グローバルに割り当てる必要があります。

この線:

NSMutableArray *p = [[VariableStore sharedInstance] pruebaGlobal];

空のグローバル配列を に割り当てますp。次に、次のようにします。

p = [NSArray arrayWithObjects:...

に新しい配列を割り当てましたp。次に、変更されていないグローバルをログに記録しようとします。

以下を追加する必要があります。

[VariableStore sharedInstance].pruebaGlobal = p;
于 2013-02-03T20:36:08.323 に答える