Objective c 从其他类调用时无法访问NSMutableArray的内容
我希望有一个数组,可以在整个Objective-C项目中访问,我可以在必要时更改它的内容。我的问题是,当我从另一个类调用数组时,我总是得到null,这不是我想要的 在我的.h文件中,我有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 @
@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
调用。