程序压垮了[order setPrice:price]断点@synthesize名称

时间:2013-01-30 05:10:31

标签: ios objective-c

请帮我解决一个简单的问题。 我是objective-c的初学者,我刚刚从java切换到objective-c。我很了解java,但不是很深入。

我正在构建一个iPhone应用程序。我的应用很简单。 我的iPhone应用程序的目的是在餐厅使用我的iphone应用程序订购。

我的应用程序的进展: 我的应用程序现在只有几个viewPanels和按钮:) Here是我的应用源代码,firstview screenshot& secondview screenshot

问题: 当我点击咖啡按钮时,我的textField不会显示咖啡名称&咖啡价格,假设出现“咖啡1”。 和xcode会把我带到iphone similator的调试器里。(我认为它压扁了一行,所以dubugger把我带到IBaction方法并打破了@synthesize这个名字;它编译没有错误。请帮助麻烦射击为什么当我按下咖啡按钮时,xcode带我去调试器。

SCREEN SHOWS UP RIGHT AFTER PRESS THE COFFEE BUTTON

这是咖啡按钮的动作代码

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];               // i assume the program crush at here when it look into setName method.
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:     // the program not even hit this line yet before crush;
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

以下代码是我的存储类,用于存储客户订购的所有商品。 它是一个二维数组,我的存储类是存储类的包装类。 数组格式如下所示:

arrayindex1->名称,价格

arrayindex2->名称,价格

arrayindex3->名称,价格

arrayindex4->名称,价格

storage.h定义

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

Storage.m

#import "Storage.h"

@implementation Storage

@synthesize name;         // program crush and goes to here.
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

Storages.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

Storages.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

- (id)init {
    self = [super init];
    if (self) {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end

4 个答案:

答案 0 :(得分:1)

这里有几个问题。

1)不要使用指针作为price属性。一般来说,除非你做了一些不寻常的事情,否则作为对象的属性将是指针,而你的属性是基元(NSInteger,BOOL,float等)将不是指针。

2)您需要确保使用NSMutableArray对象初始化订单Storages,否则订单将保持为零,每当您尝试向其添加对象时,都不会发生任何事情。要初始化NSMutableArray,请在init方法中执行此操作,如下所示。您还可以通过在for (Storage *obj in orders.getOrders) { ... }循环中放置一个简单的NSLog语句并确保在循环中至少进行一次迭代来检查该对象是否实际进入了一个有效的可变数组。如果orders.getOrders为nil,则for循环的工作块将永远不会运行。

3)听起来您需要覆盖(并且可能已经覆盖)Storage对象的-[NSObject description]方法。我的猜测是这个方法与-[NSString stringWithFormat:...]格式字符串不匹配。例如,您可能在NSInteger *的格式字符串中使用%d或%@。这样的事情肯定会导致崩溃(我认为你的意思是“Xcode带你到调试器”)。对于NSIntegers,您需要使用%d或%i。正如我和其他人所提到的那样,你想要NSInteger而不是NSInteger *,你应该改变你的财产声明。

4)根据你在这里的内容,我认为你根本不需要order课程中的Storages属性。

5)确保您没有忽略忘记将Interface Builder中的IBOutlet连接到check textField的可能性。对此进行一个很好的测试,除了确认它在Interface Builder中的连接之外,还是一个真实的检查测试,如[check setText:@"This is a test."];

6)请记住,一旦这个工作,你的for循环将很快执行,你将立即只看到orders数组中最后一个对象的描述。但这似乎不是你的问题所在。

我建议您进行以下更改:

storage.h定义

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

Storage.m

#import "Storage.h"

@implementation Storage

@synthesize name;
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

您的IBAction方法

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

Storages.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

Storages.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

- (id)init {
    self = [super init];
    if (self) {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end

答案 1 :(得分:0)

以下描述的内容是什么? (我在Storage类中看不到任何描述对象):

[check setText:[NSString stringWithFormat:@"%@",[obj description]]];

我想如果你想打印这样的名字:

[check setText:[NSString stringWithFormat:@"%@: %@",obj.name, obj.price]];

答案 2 :(得分:0)

您已在NSInteger类中使用Storages指针,这是不正确的。 NSInteger是基本数据类型,而不是指针。删除该指针并使用NSInteger变量。 我希望这能解决你的问题。

您可以使用以下代码:

@interface Storage : NSObject

@property (nonatomic, retain)NSString *name;

@property (nonatomic, assign)NSInteger price;

答案 3 :(得分:0)

你有两个错误:
1-您将价格声明为NSInteger并将其作为参考传递。正确的做法是将其作为整数传递,并在整个应用程序中将其作为整数处理 2-您没有在Storages类中初始化订单数组,因此它将始终为nil并且不会保留任何添加的对象。

您的代码可能如下所示:

在按钮的IBAction中直接传递价格

[order setPrice:price];

在存储类

- (NSString *)description {
    return [NSString stringWithFormat: @"%@        %d", name, price];
}

将以下内容添加到Storages类

-(id)init
{
    if (self = [super init])
    {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}