2009-08-28 13 views
41

私は非常に基本的な質問があります。私は新しいiPhoneプログラマです。 私の質問は、どのようにobjの関数への参照によって値を渡すことができるか誰にでも教えていただけます。 C?私はVBとC#でそれを行う方法を知っています。しかし、Obj cでそれを行う方法を知らない。目的のC(iPhone)で参照値を渡す方法

おかげ

答えて

13

目的C.における(C++の意味での)参照によるいかなる通過あなたはポインタで、あなたのオブジェクトを渡し、その値によってプリミティブ型のためにすることができますがありません。

例:

void func(NSString* string) 
{ 
    ... 
} 

void func(NSInteger myint) 
{ 
... 
} 

.. 
NSString* str = @"whatever"; 
NSInteger num = 5; 

func(str); 
func(num); 
+1

私は全く同意します!常にC++の意味で:参照渡しとは、メソッド(関数)のパラメータを別のオブジェクトを指すように変更すると、外界に影響を与えます(paramは渡されたvarの別名です)。これは実行できませんポインタの**コピー**は常にメソッド(関数)に渡されるため、パラメタの参照を解除することなくObjective Cで実行します。 – Vassilis

+1

Objective Cでは、オブジェクトの逆参照ポインタは非常にまれです。メソッドパラメータの値を変更する場合は、通常、次の2つの方法のいずれかを使用します。 Frist、多くのNSErrorの例のように、ポインタへのポインタ(double indirection、**と表示)を使用します。次に、メソッドをブロックとしてラップします。変数をブロックと同じレキシカルスコープに入れ、 '__block'ストレージタイプで指定します。 – Philip007

0

それはあなたが何を意味するかに依存します。 C(したがってObjective-C)が参照型にもっとも近いものはポインタです。名前が示すように、ポインターは他の場所に存在するデータを指します。物事を指すようにするには、ポインタを逆参照する必要があります。 Objective-Cのオブジェクトは決して直接アクセスされることはありません。あなたはいつもポインタを使ってそれらに対話します。オブジェクト以外の型へのポインタも渡すことができます。

ポインタは扱いにくいものです。私は間違いなく彼らのための感触を得るためにCで読むことをお勧めします。

void nullThisObject(ref MyClass foo) 
{ 
    foo = null; 
} 

MyClass bar = new MyClass(); 
this.nullThisObject(ref bar); 
assert(bar == null); 

である

- (void)nilThisObject:(MyClass**)foo 
{ 
    [*foo release]; 
    *foo = nil; 
} 

MyClass* bar = [[MyClass alloc] init]; 
[self nilThisObject:&bar]; 
NSAssert(bar == nil); 

と:それはC.

次のC#コードと等価であるよう

88

参照渡しObjective-Cでは、同じです

- (void)zeroThisNumber:(int*)num 
{ 
    *num = 0; 
} 

int myNum; 
[self zeroThisNumber:&myNum]; 
NSAssert(myNum == 0); 
+7

私が間違っている場合は私を修正してください!しかし、私は、上記の 'zeroThisNumber'の例では、** value **によってポインタが渡されていると考えています。ポインタのコピーが渡されます。つまり、' num'を別のintを指すように変更すると 'myNum' **変更されません**。規約では、 "参照によって"元のobjのアドレスを持つとしています。逆参照することで直接変更することができます。 – Vassilis

+0

C++のように、目的のCで実際の参照で値を渡す方法は本当に分かりません。私はいつも '*'と '**'をDarrenの記述どおりに使っていますが、前のコメントで述べたようにポインタのコピーは渡されます。もちろんこれは理論的な問題の一種です。 – Vassilis

+2

zeroThisNumberの例では、numは参照渡しです(技術的にはこれはC++の参照の意味ではありません)。この例では、numの値のアドレスがzeroThisNumberに渡されます。これにより、メソッド内で値を変更し、その変更を呼び出し元に反映させることができます。あなたが言及しているのは、参照への参照です...二重間接。 numが参照渡しで渡されなかった場合、numの値がコピーされてスタックに置かれます。 zeroThisNumber内のnumの変更はスタック上で行われ、メソッドが戻るときには失われます。 – Jason

13

Objectiを使用する場合あなたは拡張子.mmを使用して、ファイルに名前を付けるか、客観的C++など、すべてのソースをコンパイルするXcodeのを伝えることで行うことができますC++は、その後、あなたは例えばC++、と同じ方法で参照を渡すことができまし:

- (OSStatus) fileFileInfo: (FileInfo&)fi; 
0

結果の関数呼び出しから複数のアドレスを取得したい場合は、引数があります。ラッパークラスを作成して代わりに渡すことで、そうすることができます。

@interface AddressWrapper : NSObject { 
    NSArray  *array; 
    NSString *string; 
} 

@property (nonatomic, assign) NSArray *array; 
@property (nonatomic, assign) NSString *string; 
@end 

* .mをで:たとえば

@implementation AddressWrapper 
@synthesize array, string; 
@end 



-(void) getAddresses: (AddressWrapper*) wrapper { 
    wrapper.array = myNSArray; 
    wrapper.string = myNSString; 
} 
7

は、この方法を試してみてください:

-(void)secondFunc:(NSInteger*)i 
    { 
     *j=20; 
    //From here u can change i value as well 
    //now i and j value is same (i.e i=j=20) 
    } 
    -(void) firstFunc 
    { 
     NSInteger i=5; 
     [self secondFunc :&i]; 
    //i value is 20 
    } 

はそれが役に立てば幸い!