Iphone 初始化问题
我有个问题。 这是我的密码。 当我尝试使用iAction保存位置时,“arrayPosition”不会更新。 否则,如果在“SavePosition”中初始化“arrayPosition”,则该值存储在数组中。 为什么会出现这种反常现象Iphone 初始化问题,iphone,objective-c,Iphone,Objective C,我有个问题。 这是我的密码。 当我尝试使用iAction保存位置时,“arrayPosition”不会更新。 否则,如果在“SavePosition”中初始化“arrayPosition”,则该值存储在数组中。 为什么会出现这种反常现象 #import <UIKit/UIKit.h> @interface AccelerometroViewController : UIViewController <UIAccelerometerDelegate, UITextFieldDe
#import <UIKit/UIKit.h>
@interface AccelerometroViewController : UIViewController <UIAccelerometerDelegate, UITextFieldDelegate, UIAlertViewDelegate>{
//.....
NSMutableArray *arrayPosizioni;
NSMutableArray *arrayPosizioniCorrenti;
NSString *nomePosizioneCorrente;
}
-(IBAction)salvaPosizione;
//...
@property (nonatomic, assign) NSMutableArray *arrayPosizioni;
@property (nonatomic, assign) NSMutableArray *arrayPosizioniCorrenti;
@property (nonatomic, assign) NSString *nomePosizioneCorrente;
@end
#import "AccelerometroViewController.h"
#import "Position.h"
@implementation AccelerometroViewController
float actualX;
float actualY;
float actualZ;
@synthesize arrayPosition;
@synthesize arrayCurrentPosition;
@synthesize nameCurrentPosition;
-(id)init {
self = [super init];
if (self != nil) {
arrayPosition = [[NSMutableArray alloc]init];
arrayCurrentPosition = [[NSMutableArray alloc]init];
nameCurrentPosition = [NSString stringWithFormat:@"noPosition"];
actualX = 0;
actualY = 0;
actualZ = 0;
}
return self;
}
-(void)updateTextView:(NSString*)nomePosizione
{
NSString *string = [NSString stringWithFormat:@"%@", nameCurrentPosition];
textEvent.text = [textEvent.text stringByAppendingString:@"\n"];
textEvent.text = [textEvent.text stringByAppendingString:string];
}
-(IBAction)savePosition{
Posizione *newPosition;
newPosition = [[Position alloc]init];
if([newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]){
//setValue is a method of Position. I'm sure that this method is correct
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio Posizione" message:@"Posizione salvata con successo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
[arrayPosition addObject:newPosition];
}
else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio osizione" message:@"Errore nel salvataggio" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
#导入
@接口加速计控制器:UIViewController{
//.....
NSMUTABLEARRY*arrayPosizioni;
NSMUTABLEARRY*阵列相位相关;
NSString*NomeposizionCorrente;
}
-(i)丹参酮;
//...
@属性(非原子,赋值)NSMutableArray*arrayPosizioni;
@属性(非原子,赋值)NSMUTABLEARRY*arrayPosizioniCorrenti;
@属性(非原子,赋值)NSString*NomePosizionCorrente;
@结束
#导入“AccelerometroViewController.h”
#导入“Position.h”
@实现加速度计控制器
浮动实际值lx;
实际浮动;
浮动实际值;
@合成阵列位置;
@综合阵列电流位置;
@综合当前位置;
-(id)init{
self=[super init];
if(self!=nil){
arrayPosition=[[NSMutableArray alloc]init];
arrayCurrentPosition=[[NSMutableArray alloc]init];
nameCurrentPosition=[NSString stringWithFormat:@“noPosition”];
实际值lx=0;
实际=0;
实际值z=0;
}
回归自我;
}
-(void)updateTextView:(NSString*)nomePosizione
{
NSString*string=[NSString stringWithFormat:@“%@”,nameCurrentPosition];
textEvent.text=[textEvent.text stringByAppendingString:@“\n”];
textEvent.text=[textEvent.text stringByAppendingString:string];
}
-(iAction)保存位置{
Posizione*新职位;
newPosition=[[Position alloc]init];
if([newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]){
//setValue是一种定位方法。我确信这种方法是正确的
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“Salvataggio Posizione”消息:@“Posizione salvata con successo”委托:自取消按钮:@“取消”其他按钮:无];
[警报显示];
[警报发布];
[arrayPosition addObject:newPosition];
}
否则{
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“Salvataggio osizione”消息:@“Error nel Salvataggio”委托:自取消按钮:@“取消”其他按钮:无];
[警报显示];
[警报发布];
}
}
发生了什么事?
我打赌您正在xib文件中创建视图控制器
如果在行的init方法内设置断点
arrayPosition = [[NSMutableArray alloc]init];
我打赌它永远不会跑。这意味着当你到达终点时
[arrayPosition addObject:newPosition];
arrayPosition仍然是nil
,因此不会发生任何事情
如何修复它?
如果您正在初始化UIViewController,则在initWithNibName:bundle:内部调用它(如果您是在代码中创建的),或者在initWithCoder:内部调用它(如果它是在xib文件中创建的)
您需要这样做:
- (void) initialise {
arrayPosition = [[NSMutableArray alloc] init];
arrayCurrentPosition = [[NSMutableArray alloc] init];
nameCurrentPosition = @"noPosition";
actualX = 0;
actualY = 0;
actualZ = 0;
}
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if (self = [super initWithNibName:nibName bundle:bundle]) {
[self initialise];
}
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
[self initialise];
}
return self;
}
无论视图控制器是如何创建的,这都将调用initailise。发生了什么? 我打赌您正在xib文件中创建视图控制器 如果在行的init方法内设置断点
arrayPosition = [[NSMutableArray alloc]init];
我打赌它永远不会跑。这意味着当你到达终点时
[arrayPosition addObject:newPosition];
arrayPosition仍然是nil
,因此不会发生任何事情
如何修复它?
如果您正在初始化UIViewController,则在initWithNibName:bundle:内部调用它(如果您是在代码中创建的),或者在initWithCoder:内部调用它(如果它是在xib文件中创建的)
您需要这样做:
- (void) initialise {
arrayPosition = [[NSMutableArray alloc] init];
arrayCurrentPosition = [[NSMutableArray alloc] init];
nameCurrentPosition = @"noPosition";
actualX = 0;
actualY = 0;
actualZ = 0;
}
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if (self = [super initWithNibName:nibName bundle:bundle]) {
[self initialise];
}
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
[self initialise];
}
return self;
}
这将调用initailise,无论视图控制器是如何创建的。这:
[newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]
。。。这是胡言乱语。我甚至不知道它是如何编译的。我想这是个打字错误。但是,如果函数不返回布尔值,它将返回一个空指针并始终计算为false,因此永远不会调用该块
更一般地说,您的问题很可能是您没有使用self.propertyName
符号来引用您的属性,因此它们不会被保留。例如
[arrayPosition addObject:newPosition];
应该是:
[self.arrayPosition addObject:newPosition];
。。。与代码中对阵列位置的所有其他引用一样 这是:
[newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]
。。。这是胡言乱语。我甚至不知道它是如何编译的。我想这是个打字错误。但是,如果函数不返回布尔值,它将返回一个空指针并始终计算为false,因此永远不会调用该块
更一般地说,您的问题很可能是您没有使用self.propertyName
符号来引用您的属性,因此它们不会被保留。例如
[arrayPosition addObject:newPosition];
应该是:
[self.arrayPosition addObject:newPosition];
。。。与代码中对阵列位置的所有其他引用一样 嗨。您在保存位置有内存泄漏!您需要在hi结束时释放newPosition(或在alloc/init时自动释放它)。您在保存位置有内存泄漏!您需要在最后释放newPosition(或者在alloc/init时自动释放它)Hi-TechZen,问题是如果arrayPosition在方法内部初始化,那么数据会被保存,因此我们可以假设方法“setValue”确实返回YES;)此外,在init方法中,使用alloc]init]声明数组,这将保留它们。如果它们被声明而不是保留,我们可能会看到一个例外:)您使用self.arrayPosition的良好实践是正确的-这绝对是正确的做法。Hi-TechZen,问题是如果在方法内部初始化arrayPosition,数据被保存,因此我们可以假设方法“setValue”确实返回YES;)此外,在init方法中,使用alloc]init]声明数组,这将保留它们。如果它们被声明而不是保留,我们可能会看到一个异常:)Y