1

教授から、Xcode を使用して Objective-C 用の .h および .m ファイルを作成する必要があるという主な指示がありました。ほぼ完了しましたが、「式の結果が使用されていません」という2つの警告を取り除く方法がわかりません。エラーは、サイズ 100 の配列を作成するための init メソッドに関係しています。ここでは、メインがオブジェクトを作成し、次にコード化したメソッドを不適切に呼び出します。この部分は先生から渡されたもので、変更できません。

//  main.m
//  ChutesAndLadders

#import <Foundation/Foundation.h>
#import "ChutesAndLadders.h"
int main(int argc, const char * argv[])
{   
    @autoreleasepool {

        ChutesAndLadders *cl = [[ChutesAndLadders alloc]init];
        [cl initBoard];
        [cl makeChutes:10];
        [cl makeLadders:10];

        int chutes=0; 
        int ladders=0;

        for(int i=0;i<cl.board.count;i++){
            NSString * cell = (NSString *)[cl.board objectAtIndex:i];
            int additionalSpaces = (int)[cl addToMove:cell];
            if(additionalSpaces>0)
                ladders++;
            else if (additionalSpaces<0)
                chutes++;
        }
        [cl printBoard];
    }
    return 0;
}

私のメソッドの関連部分は次のとおりです。エラーは、上記の「initBoard」メソッドと、以下の「initWithCapacity」行からのものです。2 つの警告が同じエラーを説明していることはわかっています。以下のコードは私のものなので、上記とは異なり、変更できます。

@synthesize board = _board;

-(id) initBoard
    if((self = [super init]){
        [board intiWithCapacity: 100];
        for(int i = 0; i < 100; i++){
            [board addObject:@""];       
        }
    }
return self;
}

.h ファイルの「ボード」の宣言からの関連コードは次のとおりです。

@interface ChutesAndLadders : NSObject{
    @private

    NSMutableArray * board;
}
@property (readwrite, retain) NSMutableArray *board;

-(id) initBoard;

構文の小さな変更をたくさん試みましたが、役に立ちませんでした。解決策を直接教えてはいけませんが、正しい方向へのナッジまたはプッシュだけで十分だと思います。解決策を見つけたら投稿します。

疑似解:

@synthesize board=board;

-(void) initBoard{
    _board = [board initWithCapacity: 100];
    for(int i =0; i < 100; i++){
        [_board addObject:@""];
    }
}

これにより、警告の 1 つが解消されましたが、プログラムが正しく実行されていないため、他の方法で行う作業がまだ残っています。ただし、この特定の質問は対処されており、これが現在どのように機能しているかをよりよく理解しています。

実際のソリューション

@synthesize board=_board;

-(void) initBoard{
    _board = [NSMutableArray arrayWithCapacity:100];
    for(int i =0; i < 100; i++){
        [_board addObject:@"   "];
    }
}

これは、Hermannごとに最終的に機能したものです。私はこれを一度試してみてうまくいかなかったことを誓います。Xcode は時々私を苛立たせると思います。

4

4 に答える 4

2

最初は何かを見落としていたので編集してください:

単純に使用します:

ChutesAndLadders *cl = [[ChutesAndLadders alloc]initBoard];

とにかくinitBoard 内で呼び出しているため[super init]です。

あなたの教授はあなたをだまそうとしていますか?すべてのコードを見てみないとわかりません。iVar _board を持つプロパティ ボードを合成しています。self.boardまたは[self board]またはによってそれぞれゲッターまたはセッターにアクセスできることを意味します[self setBoard: ...]

ただし、initBoard メソッド内では別の方法でアクセスします。

[board intiWithCapacity: 100];

ボードが実際にどこに割り当てられているかがわからず、initWithCapacity メソッドの結果が使用されていないという事実にもかかわらず、実際には何なのか自問自答していboardます。プロパティ (self.board など) ではなく、iVar ( ) でもありません_board。どうやらboard、宣言したプライベート iVar を参照しているだけのようです。しかし

@synthesize board = _board;

_board同じ型 (NSMutableArray*)の名前で iVar を作成します。したがって、あなたの方法では、boardは とは異なります_board

これを編集するのは3回目ですが、まだ取得できていません。.m ファイルは先生から渡されたもので、対応する .h ファイルを作成する必要がありますよね? その場合、あなたは行くべきです

@private
NSMutableArray * _board;

いずれにせよ、これは自動的に行われますが、「_」を付けて記述すると、同様の名前の iVar の作成が回避されるため、エラーが発生する可能性が回避されます。

背景のAFAIK:理論的または実際的には、initはallocが作成したものとは異なるインスタンスを作成する場合があります。したがって、常に init の戻り値を使用する必要があります。

一般に、オブジェクトの初期化に関する奇妙なobjective-c表記とは無関係に、メソッドが値を返すたびに、

[object method];

構文的に正しく、正常に動作し、戻り値以外はすべて未使用です。そして、それがあなたの警告メッセージのすべてです。のようなダミーオブジェクトに割り当てても

SomeClass *someObject = [object method];

「someClass」は未使用の変数であるという警告が表示されます。

最終編集: もうすぐです。ただし、これは古いバージョンではなく、現在のバージョンの Obj-C のショートカットです: .h ファイル:

@interface ChutesAndLadders : NSObject

@property (readwrite, retain) NSMutableArray *board;

-(void) initBoard;
@end

.m ファイル:

// omitting @synthesize forces the compiler to autosynthesize. In that case it is named "_board"

    -(void) initBoard
        _board = [NSMutableArray arrayWithCapacity: 100]; // this implies the alloc
        for(int i = 0; i < 100; i++){
            [_board addObject:@""];       
        }
    }
于 2013-02-19T09:12:43.983 に答える
1

使用していないものを返品しています。Objective-C での適切なコンストラクターの作成/オブジェクトの初期化についてもお読みください。

于 2013-02-19T09:05:09.940 に答える
0

ヘルマンが言ったように

ChutesAndLadders *cl = [[ChutesAndLadders alloc]initBoard];

次に、initBoardメソッドで

self.board = [NSMutableArray alloc] intiWithCapacity: 100];
于 2013-02-19T09:16:04.733 に答える
0

標準の Objective-C の規則に従っていないため、トラップされます。

インスタンス変数ボードがあります。Objective-C の規則では、すべてのインスタンス変数はアンダースコア文字で開始する必要があります。

プロパティ ボードがあり、@synthesize ボード = _board です。合成により、_board という名前のアンダースコア文字を持つインスタンス変数が作成されます。これで、board と _board の 2 つのインスタンス変数ができました。それらの 1 つである _board は、board プロパティをサポートするインスタンス変数です。もう 1 つの board は、board プロパティとはまったく関係ありません。

そして、どこかに無害に見えるが致命的なステートメント ボード = 何でもあります。そのまったく役に立たないインスタンス変数ボードに割り当てます。_board ではなく、board です。_board と記述した場合は、Objective-C の規則に従っていることになります: 非常に目立つ名前を使用したインスタンス変数への代入。またはプロパティになるself.board。

[board initWithCapacity:100] は何もしません。まず、board インスタンス変数 (board プロパティや _board インスタンス変数とはまったく関係ありません) が割り当てられていないためです。ゼロです。initWithCapacity を nil に送信しても何も起こりません。addObject を nil に送信しても何も起こりません。

于 2014-07-31T16:55:32.737 に答える