创建Singleton NSMutableArray

时间:2013-02-03 20:26:05

标签: ios

我正在尝试使用Singleton 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]);

3 个答案:

答案 0 :(得分: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,也可以自己编写,但不能只编写其中一个。我的建议是,只从标题和实现文件中删除显式getter:- (NSMutableArray*)pruebaGlobal

答案 1 :(得分: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
您将获得对NSMutableArray pruebaGlobal的引用,然后将指针p的内容替换为其他新数组的地址。所以p现在指向pruebaGlobal

的不同对象

纠正这种情况的方法是这样的:

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

现在你应该有1个。

答案 2 :(得分:0)

问题是属性的合成ivar将命名为_pruebaGlobal。但是,您的pruebaGlobal方法正在返回pruebaGlobal ivar。

您的代码应更新为:

//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

使用现代Objective-C编译器(Xcode 4.4或更高版本),您不再需要ivar或@synthesize行。两者都将为您生成。

您不需要实施pruebaGlobal方法 - 它将为您合成。

另一半问题是您为p变量分配了一个全新的数组,这对pruebaGlobal属性没有影响。如果需要,您需要将p分配给全局。

该行:

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

将空的全局数组分配给p。然后你做:

p = [NSArray arrayWithObjects:...

将新数组分配给p。然后,您尝试记录未修改的全局。

您需要添加:

[VariableStore sharedInstance].pruebaGlobal = p;