Objective c 从其他类调用时无法访问NSMutableArray的内容

Objective c 从其他类调用时无法访问NSMutableArray的内容,objective-c,cocoa,nsarray,Objective C,Cocoa,Nsarray,我希望有一个数组,可以在整个Objective-C项目中访问,我可以在必要时更改它的内容。我的问题是,当我从另一个类调用数组时,我总是得到null,这不是我想要的 在我的.h文件中,我有 @interface MainScreen2 : UIViewController @property (nonatomic, strong) NSMutableArray *Judith; 在.m文件的viewDidLoad函数中,我有: @interface MainScreen2 () @end @

我希望有一个数组,可以在整个Objective-C项目中访问,我可以在必要时更改它的内容。我的问题是,当我从另一个类调用数组时,我总是得到null,这不是我想要的

在我的.h文件中,我有

@interface MainScreen2 : UIViewController
@property (nonatomic, strong) NSMutableArray *Judith;
在.m文件的viewDidLoad函数中,我有:

@interface MainScreen2 ()

@end

@implementation MainScreen2
@synthesize Judith;


- (void)viewDidLoad
{
   self.Judith = [[NSMutableArray alloc]     initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];                                                    
    [super viewDidLoad];
}
这很好

在另一个班级,我有:

#import "MainScreen2.h"

@interface NewGame ()
@end

- (void)viewDidLoad
{
    MainScreen2 *testJudith;

    NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
    testJudithArray = [testJudith.Judith mutableCopy];
    NSLog(@"Jud test: %@", [testJudith.Judith objectAtIndex:1]);
}
对于这一点,
NSLog
返回null。这是因为当我从MainScreen.h文件调用Judith数组时,它此时是空的,因为它尚未加载

如果是这样的话,有人能帮我把数组放在哪里,这样当我调用它时,我就能保留它的原始内容吗


编辑:4月30日

通过将这些建议结合在本页上,我现在已经解决了这个问题,它现在可以工作了

I changed the code to the following:

- (void)viewDidLoad
{
MainScreen2 *testJudith = [[MainScreen2 alloc]init];
[testJudith viewDidLoad];
NSString *test = [testJudith.Judith objectAtIndex:1];
NSLog(@"Jud test: %@", test);
}

感谢所有对论坛帖子的贡献

您说过:
MainScreen2*testJudith将testJudith设置为零

然后创建了一个数组:

NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
然后将testJudith数组重置为testJudith的Judith数组的可变副本:

testJudithArray = [testJudith.Judith mutableCopy];
但是朱迪思是零。你没有把它设定为任何东西。这意味着nil的属性将始终为/返回nil。然后尝试创建nil的可变副本。因此,testJudithArray变为零

您还没有创建testJudith,因此您永远不会创建要创建其可变副本的数组。因此,mutableCopy方法返回nil(因为发送给nil的任何消息都返回nil)


这是否足以解释错误所在?

让我们看看以下代码:

MainScreen2 *testJudith;
NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
testJudithArray = [testJudith.Judith mutableCopy];
这段代码有两个严重的问题

  • testJudithArray
    初始化,然后再次初始化。第一个值被丢弃。除非您使用的是ARC,否则这是内存泄漏。无论哪种方式,初始化它两次都没有意义

  • testJudith
    未初始化。如果幸运的话,程序会崩溃。你运气不好,所以程序给了你错误的结果


  • 您必须初始化
    testJudith
    ,代码才能正常工作。

    尝试使用单例。你可以通过谷歌搜索singleton来获取更多信息。使用单例将允许您访问相同的字符串、数组等。。。从项目的任何地方

    通过添加一个新的Objective-C类并使其成为NSObject的子类来创建一个singleton。例如:

    #import <Foundation/Foundation.h>
    @interface MyClass : NSObject
    +(MyClass *)sharedInstance;
    @end
    
    #import "MyClass.h"
    @implementation MyClass
    + (MyClass *) sharedInstance
    {
    if (!_sharedInstance)
    {
        _sharedInstance = [[MyClass alloc] init];
    }
    return _sharedInstance;
    }
    @end
    
    要向MyClass数组添加内容,请执行以下操作:

    MyClass *myClass = [MyClass sharedInstance];
    NSString *myString = [[myClass someArray] objectAtIndex:1]; 
    
    [[myClass someArray] addObject:@"something"];
    

    viewDidLoad
    init
    不同……您可以在
    init
    中移动NSArray的分配,或者调用
    [testJudith viewDidLoad]

    从什么时候开始
    MainScreen2*testJudith是否将其初始化为
    nil
    ?这是新的吗?声明Objective-C值而不设置它会自动将其设置为nil。所以我可以把Random,Random;并保证随机实例变量在此阶段为零。在ARC中,它被定义为最终行为。是否有相关文档?(在ARC之前,它肯定没有这样做)。在WWDC 2011引入的自动引用计数会话(323)中提到在21分钟时指针必须初始化为零。这是最佳实践的形式化。@Dietrich:苹果指南中有一个非常简短的条目。这仅在使用ARC编译时发生,并且它只是对象变量;为MRR编译,即使使用最新的clang,仍然会导致未初始化自动变量的未定义值。答案很好,但对于#2,如果您向nil发送消息(因为所有ARC对象都设置为自动),它只会无声地返回nil。因此,如果将其分解为
    [[testJudith Judith]mutableCopy]
    ,则其计算结果为
    [nil mutableCopy]
    ,其计算结果为
    nil
    ,这是分配给可变数组的有效值。您不应该直接调用
    -viewDidLoad
    ,而应该让
    -loadView
    调用它。直接调用它可能会导致问题。您不应该直接调用
    -viewDidLoad
    ,应该让它从
    loadView
    调用。