0

getTimerIntervalという名前の関数がNSTimerInterval値を返しました

-(NSTimeInterval *)getInterval {
    NSTimeInterval interval = 1;
    return interval;
}

Xcodeは私に警告します

互換性のない結果タイプ'NSTimeInterval*'(別名'double *');を持つ関数から'NSTimeInterval'(別名'double')を返します。「returninterval」の行に「&」が付いているアドレスを取得します

さて、NSIntegerタイプは問題ありません:

-(NSIntefer)getInteger {
    NSIntefer result = 1;
    return result;
}

直接番号を返すだけでなく:

 -(NSTimeInterval *)getInterval {
     return 1;
 }

OK、その後getInterval関数を呼び出すと警告が表示されます。

[NSTimer scheduledTimerWithTimeInterval:[self getInterval] target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

'NSTimeInterval *'(別名'double *')を互換性のないタイプ'NSTimeInterval'(別名'double')のパラメーターに送信します。*による間接参照

&と*が混同されていますが、どこで&または*を使用する必要がありますか?その意味は実際には何ですか?
私はそれがポインタか何かについてのc++構文であることを知っています、上級者に感謝します。

4

3 に答える 3

2

コンパイラの警告を修正するには、次のように、コンパイラのアドレスを返す必要があります。

-(NSTimeInterval *)getInterval {
    NSTimeInterval interval = 1;
    return &interval;
}

ただし、メソッドのスタックフレームのアドレスを返すので、それは悪いことです。このアドレスは、戻ると消えます。次のように返してみませんか。

-(NSTimeInterval)getInterval {
    NSTimeInterval interval = 1;
    return interval;
}

これにより、他のコンパイラエラーも修正されると思います。

于 2012-07-04T15:52:01.053 に答える
0

Objective-Cのポインタは文字通りのメモリビットであるため、ポインタ(*)を使用して値を渡すと、そのメモリアドレスが使用されます。一方、アンパサンドは文字通り「のアドレス」を意味し、通常、メソッドが変数自体(多くの場合、それが指すもの)を変更する場合に、int、BOOL、doubleなどのプリミティブデータ型変数に使用されます。同様に)そして使用可能な値を返します。NSErrorは、このロジックにかなり一貫して従います。

于 2012-07-04T15:51:49.757 に答える
0

これは基本的なC(したがってObjective-c)構文であり、「変数のアドレス」(&)とその逆の「アドレスの値」()を意味します*。アドレスはポインタと呼ばれます。これを非常に詳細に説明しているサイトは何百もあります。

簡単な例:

NSInteger i=1;
NSInteger *ptr;

ptr = &i;

NSLog(@"The pointer %p points to value %d (which is equal to %d)",ptr,*ptr,i);
于 2012-07-04T15:49:55.140 に答える