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: