Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Iphone 初始化问题_Iphone_Objective C - Fatal编程技术网

Iphone 初始化问题

Iphone 初始化问题,iphone,objective-c,Iphone,Objective C,我有个问题。 这是我的密码。 当我尝试使用iAction保存位置时,“arrayPosition”不会更新。 否则,如果在“SavePosition”中初始化“arrayPosition”,则该值存储在数组中。 为什么会出现这种反常现象 #import <UIKit/UIKit.h> @interface AccelerometroViewController : UIViewController <UIAccelerometerDelegate, UITextFieldDe

我有个问题。 这是我的密码。 当我尝试使用iAction保存位置时,“arrayPosition”不会更新。 否则,如果在“SavePosition”中初始化“arrayPosition”,则该值存储在数组中。 为什么会出现这种反常现象

#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