0

您好我正在尝试为我的 iphone 应用程序构建一个存储类。存储类用于存储食品订单列表,每个订单都有食品名称和价格。在应用程序中,当我按下食物菜单上的按钮时,我想将它按顺序存储到一个名为 orders 的数组中。我是 Objective-c 的新手,我是 Java 用户。我要构建的是一个类似于 java 的 ArrayList 类的存储类,myStorage 类保存食物名称和价格。

我已经构建了一些代码,但是在 @property (nonatomic) NSMutableArray *orders 的 Storages.h 上编译时出现错误“'order' 的本地声明隐藏了实例变量”;

存储.h

#import <Foundation/Foundation.h>

@interface Storage : NSObject{
    NSString *name;
    NSInteger *price;
}
@property (nonatomic)NSString *name;
@property (nonatomic)NSInteger *price;
-(void) setName: (NSString *) n;
-(void) setPrice: (NSInteger *) p;
-(NSString *)getName;
-(NSInteger *)getPrice;

@end

存储.m

 #import "Storage.h"

 @implementation Storage


 @synthesize name;
 @synthesize price;


 - (void)setName:(NSString *)n {
     name = n;
}
 - (void)setPrice:(NSInteger *)n {
    price = n;
}
- (NSString *)getName{
return name;
}
- (NSInteger *)getPrice{
    return price;
}


@end

存储.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject{
    Storage *order;
    NSMutableArray *orders;

@property (nonatomic) NSMutableArray *orders; // error "Type of property 'orders' does not match type of accessor 'setOrder'"

-(void) setOrders:(Storage *)order;
-(NSMutableArray *) orders;
@end

存储.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

-(void) setOrders:(Storage *)oneOrder{  

    [orders addObject: oneOrder];
}
-(NSMutableArray *) orders;{
    return orders;
}
@end
4

3 回答 3

1

作为一名 Java 程序员,我可以说最接近 ArrayList 的是 NSMutableArray。所以你在你的存储文件中做得很好。

您收到的警告是因为您实际上隐藏了 ivar(类变量)。

在这种情况下,可以这样声明:

@interface Storage : NSObject

@property(nonatomic,strong) name;
@property(nonatomic,strong) price;

@end

然后在 .m 文件中合成这些属性。

另一个错误是一样的。当您创建并@synthesized 一个 @property 时,编译器将为该 props 编写访问器,除非您提供自己的,在这种情况下您提供自己的,但签名并没有太多。

它不完全相同,但就像您用 Java 编写的一样:

public void setOrders(List<Order> list) {
}


@Override
public void setOrders(Order order) {
}

jdk 会阻止你这样做。

另外,非常重要的是,您已将您的问题标记为 iOS,那么您就没有 Java 中的垃圾收集器。

使用@property 的好处是编译器将为您编写所有必要的代码行来释放先前的变量并分配一个新值。

如果你用你的代码覆盖,你将失去所有这些好处并得到一些内存泄漏。

于 2013-01-29T11:16:28.627 回答
0

就像您将 order 声明为 ivar 并且 functions 参数将其隐藏起来一样简单。我的建议是根本不要使用 ivars,只使用属性。在你的情况下,这个警告不会有太大的伤害,只要确保你知道你正在访问哪个变量。在这种情况下,您甚至无法访问 ivar,所以您很好。

我会删除所有 ivars 并将 order 声明为私有财产(在 .m 文件中):

@interface Storages()

@property (nonatomic,strong,readwrite) Storage* order;

@end

甚至不要合成它,它会自动合成到 _order 这样你就可以避免名称冲突。

于 2013-01-29T11:15:50.933 回答
0

您有一个已经调用的实例变量order。将您的参数重命名为其他名称,或使用下划线重命名您的实例变量_order

于 2013-01-29T11:15:31.297 回答