0

現在、UITableViewのどのセルが選択されているかに応じて入力された配列を保存しようとしており、この配列を別のオブジェクトのインスタンスに保存しています。配列が正常に読み込まれるようになりましたが、バーボタンをクリックして呼び出されるIBActionであるsaveメソッドが機能していないようです。ここにいくつかのコードがあります:

-(IBAction)saveWorkout:(id)sender {
    Workouts *new = [[Workouts alloc] init];
    [new addNewWorkout:customWorkout];

    [customWorkout removeAllObjects];
}

このコードはファーストクラスのものです。

そして、これがWorkoutsクラスのaddNewWorkoutsメソッドのコードです。

-(void)addNewWorkout:(NSMutableArray*)array {
    NSMutableArray *temp = [[NSMutableArray alloc] init];
    temp = array;

    self.workoutList = temp;

    [temp release];

}

これが私の「Workout.h」です

#import <Foundation/Foundation.h>


@interface Workouts : NSObject {
    NSString *workoutName;
    NSMutableArray *workoutList;
    NSString *description;
    int *reps;
    int *weights;
    int *sets;
}
@property (nonatomic, retain) NSString *workoutName;
@property (nonatomic, retain ) NSString *description;
@property (nonatomic, retain) NSMutableArray *workoutList;

-(void)addNewWorkout:(NSMutableArray*)array;

@終わり

このコードを実行する前に、Xcodeから「ワークアウトが「addNewWorkouts」に応答しない可能性がある」という警告が表示されます。

このエラーの原因を知っている人はいますか?ビルドして実行したら、[保存]ボタンをクリックすると、アプリがクラッシュし、認識されないセレクターがインスタンス0x3b04410エラーに送信されます。

4

1 に答える 1

2

[new addNewWorkouts:customWorkout] メソッドのセレクターが次の場合に呼び出しますaddNewWorkout:(メソッド名に複数形がないことに注意してください)。

これにより、不正なメソッド呼び出しが行われ、クラッシュが発生します。

また、addNewWorkout メソッドのメモリ管理にも問題があります。

1- NSMutableArray *temp = [[NSMutableArray alloc] init];
2- temp = array;
3- self.workoutList = temp;
4- [temp release];

1 行目で新しい NSMutableArray を割り当て、ポインタを「配列」に置き換えると、2 行目でその参照が失われます。作成したばかりの割り当てが失われ、プログラムがリークします。

次に、4 行目で、リリース メッセージを 'temp' に送信します。このメッセージは、実際には 'array' を指しています。その結果、一時オブジェクトではなく、受け取ったパラメーターが解放されます。

一時配列を作成する理由はありますか? プロパティを割り当てるだけで、必要に応じてプロパティをコピーまたは保持できます。

于 2012-04-10T18:10:25.320 に答える