【问题标题】:Why is my NSMutableArray, located in a singleton, returning (null)?为什么我的位于单例中的 NSMutableArray 返回(null)?
【发布时间】:2012-12-12 12:03:07
【问题描述】:

我在 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]);

}


...

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

【问题讨论】:

    标签: objective-c null nsmutablearray singleton nsnumber


    【解决方案1】:

    改变

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

    self->_mySNRArray = [[NSMutableArray alloc]init];
    

    在您的 init 方法中,您正在创建一个本地可变数组,但没有将其分配给您的属性

    【讨论】:

    • self-&gt;_mySNRArray 是正确的,但您也可以删除self-&gt; 并使用_mySNRArray
    • +1 同样使用[NSMutableArray insertObject:atIndex:] 看起来很狡猾; NSMutableArray 不允许稀疏数组。
    • @BenedictCohen 是的,这只是为了风格,但认为这可能会使这个问题更清楚
    【解决方案2】:

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

    _mySNRArray = [[NSMutableArray alloc]init];
    

    即使你可以从你的 .h 中省略这些

    {
    
    NSMutableArray *mySNRArray;
    
    }
    

    【讨论】:

    • 这与@wattson12 7 分钟前给出的答案相同?!?
    • 我删除了 self-> 并添加了 { NSMutableArray *mySNRArray; }
    • 会省略 mySNRArray 在 32 位 OSX 运行时上的声明吗?
    • 那么,您建议在所有较新的应用程序中我们必须同时使用 ivars 和属性?正如他所说,他使用的是 xcode4.5.1,所以我建议他不用那个 ivar 就可以了……而且我不知道他的目标是不是 ppc !!!
    • 如果他正在为 32 位 OSX 编译他不能(他没有指定他正在构建什么)。无论如何,当您返回代码并且对声明事物的位置感到困惑时,所有那些您不需要声明事物的“节省时间的功能”都会花费您的维护时间。他们既懒惰又愚蠢。
    【解决方案3】:
    + (id)sharedManager
    

    返回一个值

    static MyManager* sharedManager
    

    界面改为

    + (MyManager*)sharedManager
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多