Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对象自动设置为零_Ios_Objective C_Variables_Null - Fatal编程技术网

Ios 对象自动设置为零

Ios 对象自动设置为零,ios,objective-c,variables,null,Ios,Objective C,Variables,Null,首先,这是我的代码: - (void)viewDidLoad { [super viewDidLoad]; self.elements = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil]; self.elements2 = @"Lorem ipsum"; NSLog(@"%@", self.elements); [self loadContent]

首先,这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.elements = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];
    self.elements2 = @"Lorem ipsum";
    NSLog(@"%@", self.elements);

    [self loadContent];
}
他打印出,_元素在
loadContent
之后也被正确初始化,_元素包含三个对象。 但是在方法
numberOfComponentsInPickerView
:(直接在
viewDidLoad
方法之后调用)中,只有几行后面的元素是
nil
。 我不知道为什么我的应用程序将元素设置为
nil

谢谢我的电脑破解


编辑 我已将完整代码上载到gist.github:


控制台输出 好的,这里是我的控制台输出:

// in viewDidLoad (after setting): 
2014-05-13 16:56:14.292 HFG Vertretungsplan[1051:60b] (
    "Object 1",
    "Object 2",
    "Object 3"
)
// numberOfComponents called automatically:
2014-05-13 16:56:14.298 HFG Vertretungsplan[1051:60b] numberOfComponentsInPickerView: (null)
2014-05-13 16:56:14.303 HFG Vertretungsplan[1051:60b] numberOfComponentsInPickerView: (null)
// viewWillAppear method reached:
2014-05-13 16:56:14.306 HFG Vertretungsplan[1051:60b] View will appear
2014-05-13 16:56:14.306 HFG Vertretungsplan[1051:60b] Elements in viewWillAppear: ( // NSLog("%@", self.elements);
    "Object 1",
    "Object 2",
    "Object 3"
)
// [self.elementsPicker reloadAllComponents];
2014-05-13 16:56:14.307 HFG Vertretungsplan[1051:60b] numberOfComponentsInPickerView: (null)
2014-05-13 16:56:14.308 HFG Vertretungsplan[1051:60b] Elements after reloadAllComponents: (
    "Object 1",
    "Object 2",
    "Object 3"
)

因此,只有在重新加载组件时,元素为nil。在这之前和之后,它都有内容。

在强对象上应该是这样

whenever you retain the the object you should use self.yourObject

self.elements = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];

"elements" should be strong or retain pointer in .h files

试着做所有这些事情

在定义NSMutableArray属性的位置,确保它是
非原子的
保留的

@property(nonatomic, retain) NSMutableArray* elements;
在.m文件中,执行以下操作:

@synthesize elements;
始终使用self访问它,如下所示:

self.elements = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];
#import <UIKit/UIKit.h>

@interface SettingsViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

@property (nonatomic, weak) IBOutlet UITextField *userTextField;
@property (nonatomic, weak) IBOutlet UITextField *passwordTextField;
@property (nonatomic, strong) IBOutlet UIPickerView *elementPicker; // I would suggest to use sttong for outlets if you are planning to move them out of their superview
//@property (nonatomic, retain) NSMutableArray *elements; // if you use ARC I would suggest to forget about retain in favor of strong.
@property (nonatomic, strong) NSMutableArray *elements;
//@property NSString *elements2; // I would suggest not to rely on implicit property specifier declarations in favor of more verbosity
@property (nonatomic, strong) NSString *elements2;


- (IBAction)userOrPasswordChanged:(id)sender;

@end
最好是在分配数组时,像这样使用它

[self setElements: array2];
而不是

elements = array2;


悬空指针

覆盖您的_元素getter

- (NSMutableArray *)elements
{
    if (!_elements)
        _elements = [[NSMutableArray alloc] init];
    return _elements;
}
第一次打电话给"元素",

self.elements

我通常制作如下标题:

self.elements = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];
#import <UIKit/UIKit.h>

@interface SettingsViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

@property (nonatomic, weak) IBOutlet UITextField *userTextField;
@property (nonatomic, weak) IBOutlet UITextField *passwordTextField;
@property (nonatomic, strong) IBOutlet UIPickerView *elementPicker; // I would suggest to use sttong for outlets if you are planning to move them out of their superview
//@property (nonatomic, retain) NSMutableArray *elements; // if you use ARC I would suggest to forget about retain in favor of strong.
@property (nonatomic, strong) NSMutableArray *elements;
//@property NSString *elements2; // I would suggest not to rely on implicit property specifier declarations in favor of more verbosity
@property (nonatomic, strong) NSString *elements2;


- (IBAction)userOrPasswordChanged:(id)sender;

@end
#导入
@接口设置查看控制器:UIViewController
@属性(非原子,弱)IBOutlet UITextField*userTextField;
@属性(非原子,弱)IBOutlet UITextField*passwordTextField;
@属性(非原子,强)IBUIPickerView*elementPicker;//如果您打算将其移出superview,我建议将sttong用作门店
//@属性(非原子,保留)NSMutableArray*元素;//如果您使用ARC,我建议您忘记保留,转而使用strong。
@属性(非原子,强)NSMutableArray*元素;
//@属性NSString*elements2;//我建议不要依赖隐式属性说明符声明,而要更加详细
@属性(非原子,强)NSString*elements2;
-(iAction)userOrPasswordChanged:(id)发件人;
@结束
然后在.h或.m文件中,您不需要再次声明
\u元素
(或
元素
),因为它是通过属性声明自动创建的。如果您需要声明它(在某些情况下是需要的),您应该仔细阅读命名约定

有了这样的标题,原始问题就应该得到解决,除非您在剩下的代码中做了一些奢侈的事情

编辑:我已经在topic starter的真实代码中挖掘了一点。问题是他有两个SettingsViewController实例。他们都以他的故事板为背景

因此,其中一个实例用于显示在屏幕上,因此会调用
viewDidLoad
方法,并填充
\u元素
,另一个实例由故事板以静默方式创建,并用作UIPickerView的数据源和委托的实例。第二个实例未显示,因此它的
viewDidLoad
方法未被调用,
\u元素
为零

因此,如果您将
self
元素一起打印,您将看到差异


如果删除图片中的第二个实例,您将使所有内容正常工作。

我查看了您的项目,我想知道,为什么要使用两个elements array实例?因为在现代运行时中,只需要一个实例

我更喜欢在属性上声明对象,因为我认为这样可以更清楚地管理从nib加载的对象的内存。看一看,我想你会明白我的意思

可能的解决办法
创建self.elements并在其中包含对象后,尝试重新加载pickerView。

如何定义_元素?这是一处房产后面的iVar吗?如果是这样的话,您应该使用self.elements,而不是_元素,并且您应该确保属性为(strong),我使用自动引用计数。所以[\u elements retain]是不可能的。@i计算机破解检查我的答案。您是单独定义了
\u elements
还是从
@属性中推断出来的?i、 你有像……这样的线路吗<代码>NSMUTABLEARRY*_元素…
我觉得这里缺少代码。你能展示一下这里涉及的所有代码吗。就像整个班级一样。使用gist.github.com上载大量代码,然后将其链接到此处。我完成了所有操作,但什么也没发生。覆盖getter时,我得到一个错误:EXC_BAD_access现在我得到一个空数组,而不是nil。。。这并不是更好:数据这是,你可以设置,这个数组总是返回真值。谢谢那么,.m文件中不需要@synthesis?因为我更喜欢使用_元素而不是元素。使用self.elements而不是_元素有什么区别?所以在.m文件中不需要@synthesis不再是了。旧的Xcode版本需要这样做,但从Xcode 4.6(如果我没记错的话)开始,Xcode就为您做了。使用self.elements而不是_elements有什么区别?您应该了解Objective-C中的属性。简而言之,self.elements在self.elements=someArray的情况下调用-(void)setElements:(NSMutableArray)newElements和-(NSMutableArray)elements方法作为getter和setter;someArray=self.elements;分别,而_元素是对实例变量的普通访问。好的。当我有时间的时候,我会读更多关于财产的书:)你是上帝!非常感谢你!这很有效。我不知道,我可以将数据源和委托直接链接到viewcontroller。我总是添加一个对象并将其链接到该对象,因为在我的编程书中对它进行了这样的解释。再次感谢你!你太棒了!我还尝试在{}中不使用NSMutableArray*元素。我只是添加了这个,因为在很多教程中,我看到了这个。它已经被移除了。我刚试过。一个问题,你怎么知道数组变为零?此外,您未将对象正确设置为NSUserDefaults[[NSUserDefaults standardUserDefaults]setObject: