0

これはおそらく完全な初心者の質問ですが、私はこれを自分で理解することはできないようです。こことグーグルで検索しましたが、運がありませんでした。

たとえば、「logme」などの名前のクラスがあります。.hファイルにfloat*floatersを実装し、プロパティを作成して.mファイルに合成します。.mファイルmethod1とmethod2内の2つのメソッド。ビューコントローラからmethod1を実行すると、フローター変数がいくつかの値を持つ配列になります。私はそれらをNSLogして、それらがそうであるかどうかを確認します。その後、同じ配列のみをNSLogするmethod2を実行しますが、配列の値は完全に異なります。

logme.h

@interface Logme : NSObject {
    float *floaters;
}
-(void)method1;
-(void)method2;

logme.m

@implementation Logme
-(void)method1 {
    floaters = (float[8]) {
        1.0f, 2.0f,
        3.0f, 4.0f,
        6.0f, 5.0f,
        7.0f, 8.0f,
    };
    for (int i = 0; i < 8; i++) {
        NSLog(@"%f", floaters[i]);
    }
}
-(void)method2 {
    for (int i = 0; i < 8; i++) {
        NSLog(@"%f", floaters[i]);
    }
}
@end

viewcontrollerからメソッドを呼び出す:

logme = [Logme alloc];
[logme method1];
[logme method2];

結果:

NSLog from method1:
1.000000
2.000000
3.000000
4.000000
6.000000
5.000000
7.000000
8.000000

NSLog from method2:
0.000000
-1.998885
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
  • ごめんなさい。私はこの4つのスペースシステムと戦っていました。.mファイルコードを追加することはできません。ついにここに入れました:)
4

2 に答える 2

2

スタック内にあるメモリのブロックにポインタを割り当てているということは、mrthod1を終了すると、そのメモリの割り当てが解除されることを意味します。method1の後に出力される値はカジュアルな場合、メモリが変更されない場合もありますが、通常、スタックはメソッド呼び出しごとに変更されるため、これが当てはまります。

選択肢1

フローターを配列として使用しているので、それを配列として宣言すると、独自のストレージが作成されます。

@interface Logme : NSObject {
float floaters[8];
}

-(void)method1 {
    for(int i=0; i<8;i++)
        floaters[i]=i+1;
for (int i = 0; i < 8; i++) {
    NSLog(@"%f", floaters[i]);
}

選択肢2

フローターをポインターとしますが、フローターのメモリーを動的に割り当てます。

-(void)method1 {
floaters=(float*)malloc(8*sizeof(float));
for(int i=0; i<8; i++)
    floaters[i]=i+1;
for (int i = 0; i < 8; i++) {
    NSLog(@"%f", floaters[i]);
}

そして、もう必要なくなったときにメモリを解放することを忘れないでください。

于 2012-11-16T23:09:01.627 に答える
0

直接の答えはコメントで@HotLicksによって与えられました。もう少し説明したいと思いました。

メソッドに次のようなものがある場合:

- (void)someMethod {
    float *numbers = (float[8]) {
        1.0f, 2.0f,
        3.0f, 4.0f,
        6.0f, 5.0f,
        7.0f, 8.0f,
    };
}  // <-- end of scope for these values

値のメモリは、スタックと呼ばれるメモリの特別な領域に配置されます。このメモリは、値がスコープ内にある間だけその場所に留まります。つまり、コードブロックの閉じ中括弧に達すると、スタックとそのメモリがなくなります。

あなたの場合、スタックメモリのこのブロックをインスタンス変数に割り当てています。したがって、ブロックの終わりに到達してスタック値がなくなると、インスタンス変数は同じメモリ位置を指したままになります。しかし、値はもうありません。そのメモリスペースは、おそらく他の目的で再利用されています。

これが、2番目の方法が異なる値を出力する理由です。同じメモリから8つのfloat値にアクセスしようとしていますが、メモリは別の目的で再利用されています。

いくつかの可能な解決策があります。malloc配列にメモリを割り当て、その値をそのメモリ空間にコピーするために使用できます(後でメモリを解放しますfree)。NSArrayまたは、またはを使用できますNSMutableArray

于 2012-11-16T23:05:22.203 に答える