0

関数内のインスタンス変数の値を変更できません。

クラスを定義しました:

//  info.h
#import <Foundation/Foundation.h>

@interface NSMyObject : NSObject 
{
    NSInteger i;
}

-(void) setI:(NSInteger)v;

 @end

#import "info.h"

@implementation NSMyObject

-(void) setI:(NSInteger)v ;
{
    i=v;    
}

- (void)dealloc {
    [super dealloc];
}

@end

NSMyObjectインスタンスであるパラメーターtemObjを使用して関数'myFunction'を呼び出します。

myFunction(temObj);//temObj is NSMyObject

この関数では、パラメータのインスタンス変数の値を変更できますobj

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
}

...これによりの内容が変更されることを期待していますtemObj

しかしobj、関数内での操作の結果を確認するとmyFunction、の値はtemObj.i変更されていません。

コメントを歓迎します

ありがとう

4

3 に答える 3

1

これを行うのに問題はありません。

ただし、コードには問題があります。技術的にではなく、従来どおりです。

独自のカスタムオブジェクトの前にNSを付けないでください。これがAppleのFoundationフレームワークの接頭辞です。

自分のクラスの前に、自分の名前、アプリの名前、会社名などの略語を付ける必要があります。

Appleはフレームワークに多くのプレフィックスを使用しており、同じプレフィックスを使用すると、最終的にクラス名間で衝突が発生します。

于 2010-06-17T12:18:48.503 に答える
1

関数またはメソッド内で渡されたオブジェクトの属性の値を変更できる必要があります。

あなたの問題は、myFunction上記のコードでは関数として定義されているのではなく、クラスのインスタンスメソッドとして定義されていることだと思います。次のようにスタンドアロンでは機能しません。

myFunction(temObj);

...代わりに、次のように呼び出す必要があります。

[someInstanceOfAClass myFunction:tempObj];

それがあなたの問題だと思います。関数のようなメソッドを呼び出そうとすると、コンパイラの警告が表示されるはずです。

メソッドを適切に呼び出すと、次のことができるようになります。

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
    NSLog(@"obj.i = %d",obj.i);
}

...そしてobj.iコンソールに印刷された設定した値を確認してください。

適切に呼び出してもの値がobj.i変わらない場合、最も可能性の高い説明は、メソッドに渡したインスタンスではなく、NSMyObjectの別のインスタンスを見ていることです。

于 2010-06-17T12:46:02.317 に答える
0

コードに構文の問題はありませんが、次のような推奨される方法に従うことができます。変数のプロパティを次のように作成できます。

@property(nonatomic, readwrite) NSInteger i;

そして、実装クラスよりも、次のように合成します

@synthesize i;

これで、メソッドに値を設定しようとすると、コードがその役割を果たします。

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
}

もう1つ、標準の推奨コーディング規約を使用してみてください。名前がキーワードである場合があり、コンパイル時にエラーや警告が表示されなくても問題が発生します。

于 2010-06-17T13:29:06.343 に答える