0

我正在尝试做一个单例 NSMutableArray,但计数函数总是显示 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。如果将属性声明为保留,则可以让编译器同时处理 getter 和 setter,或者自己编写两者,但不能只编写其中一个。- (NSMutableArray*)pruebaGlobal我的建议,只需从头文件和实现文件中删除显式 getter: 即可。

于 2013-02-03T20:41:23.180 回答
0

这部分代码至少有两个问题:

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到 a中NSArray,您需要插入[NSNull null]一个专门为该用途而存在的单例对象。

另一个问题是使用p
您正在获取对您的NSMutableArraypruebaGlobal 的引用,然后您将指针的内容替换为p另一个新数组的地址。所以p现在指向一个不同的对象pruebaGlobal

纠正这个问题的方法是这样的:

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 回答