为什么我的NSMutableArray位于单例中,返回(null)?

时间:2012-12-12 12:03:07

标签: objective-c null nsmutablearray singleton nsnumber

我在Objective-C中使用Xcode 4.5.1。我正在进行听力测试,并希望将相关数据存储到阵列中的每个问题中。我做了一个单身MyManager。我用它来存储数据。

它对于简单的int / float值等工作正常,但我试图使用NSMutableArray。我是Objective-C的新手,所以我假设/希望我犯了一些明显的错误。

所以,我想用浮点值填充mySNRArray。我已经明白我不能简单地添加浮点数,因为它只会占用对象。因此,我使用NSNumber。

问题:当我尝试读取我应该添加到NSMutableArray的数据时,我得到(null)。

我现在将提供相关代码:

MyManager.h

@interface MyManager : NSObject
{

NSMutableArray *mySNRArray;

}

@property (readwrite) NSMutableArray *mySNRArray;

+ (id)sharedManager;

@end

MyManager.m

@implementation MyManager

@synthesize mySNRArray;

+ (id)sharedManager
{
static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {

            sharedMyManager = [[self alloc] init];

    });

return sharedMyManager;
}

- (id)init
{
if (self = [super init])
{

    NSMutableArray *mySNRArray = [[NSMutableArray alloc]init];

}

return self;
}

@end

TestViewController.m

//First, I try to add a value to mySNRArray.

MyManager *Manager = [MyManager sharedManager];

NSNumber *tempStorage1 = [[NSNumber alloc] initWithFloat:mySNR];

[Manager.mySNRArray insertObject:tempStorage1 atIndex:questionNumber];

//The NSLog below is showing the correct value.

NSLog(@"%@ : mySNR", tempStorage1);


...


for (n = 0; n < questionNumber; n++)
{

//Second, I try to acces the values I supposedly added to mySNRArray. 

MyManager *Manager = [MyManager sharedManager];

//This NSLog below is showing (null).

NSLog(@"Value at %i in SNRArray = %@", n, [Manager.mySNRArray objectAtIndex:n]);

}


...

我希望有人能解释我的错误。

3 个答案:

答案 0 :(得分:3)

更改

NSMutableArray *mySNRArray = [[NSMutableArray alloc]init];

self->_mySNRArray = [[NSMutableArray alloc]init];
在您的init方法中,您正在创建一个本地可变数组,但不将其分配给您的属性

答案 1 :(得分:0)

不使用创建新对象,而是使用您在init方法中创建的ivar。

_mySNRArray = [[NSMutableArray alloc]init];

即使你可以从你的.h

中省略这些
{

NSMutableArray *mySNRArray;

}

答案 2 :(得分:0)

+ (id)sharedManager

返回值

static MyManager* sharedManager

将界面更改为

+ (MyManager*)sharedManager

编译器会告诉你你犯了什么错误。