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