0

こんにちは私は私のiphoneアプリのストレージクラスを構築しようとしています。ストレージクラスは、食品の注文のリストを保存するためのものであり、各注文には食品の名前と価格があります。アプリでは、フードメニューのボタンを押すとordersという名前の配列に順番に保存したいと思います。Objective-cは初めてで、Javaユーザーです。私が構築したいのは、JavaのArrayListクラスに類似したストレージクラスであり、myStorageクラスは食べ物の名前と価格を保持します。

私はすでにいくつかのコードをビルドしましたが、@ property(nonatomic)NSMutableArray*ordersのStorages.hで「'order'のローカル削除はインスタンス変数を非表示にします」というエラーでコンパイルされました。

Storage.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

Storage.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

Storages.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

Storages.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ファイルに合成します。

他のエラーも同じです。@propertyを作成して@synthesizedすると、コンパイラは、独自のプロップを提供しない限り、そのプロップのアクセサーを作成します。この場合は、独自のアクセサーを提供しますが、署名はそれほど多くありません。

まったく同じではありませんが、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すでに呼び出されているインスタンス変数があります。引数の名前を別の名前に変更するか、インスタンス変数の名前をアンダースコアに変更します_order

于 2013-01-29T11:15:31.297 に答える
0

orderをivarとして宣言し、functionsパラメーターがそれをシャドウするので単純です。私の提案は、ivarをまったく使用せず、プロパティのみを使用することです。あなたの場合、この警告はそれほど害にはなりません。アクセスしている変数を知っていることを確認してください。この場合、ivarにアクセスすることすらできないので、問題ありません。

すべてのivarを削除し、注文をプライベートプロパティとして宣言します(.mファイル内):

@interface Storages()

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

@end

合成すらしないでください。名前の競合を避けるために、自動的に_orderに合成されます。

于 2013-01-29T11:15:50.933 に答える