2

これを見てください:

#import <Foundation/Foundation.h>

@interface ClassA : NSObject

-(NSString *) method1:(NSString*)str1;

@end

@implementation ClassA

-(NSString *) method1:(NSString*)str1
{
    NSLog(@"2. %@ at %p", str1, str1);
    str1 = @"foo";
    NSLog(@"3. %@ at %p", str1, str1);  
    return str1;
}

@end


int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");
        NSString *str = @"moo";
        NSLog(@"1. %@ at %p", str, str);
        ClassA *a = [[ClassA alloc] init];
        NSString *b = [a method1:str];
        NSLog(@"4. %@ at %p", str, str);
        NSLog(@"5. %@ at %p", b, b);
    }
    return 0;
}  

コンソール ログは次のとおりです。

2012-09-11 17:03:16.160 passByValue[1559:403] Hello, World!
2012-09-11 17:03:16.162 passByValue[1559:403] 1. moo at 0x104c42248
2012-09-11 17:03:16.162 passByValue[1559:403] 2. moo at 0x104c42248
2012-09-11 17:03:16.163 passByValue[1559:403] 3. foo at 0x104c421e8
2012-09-11 17:03:16.163 passByValue[1559:403] 4. moo at 0x104c42248
2012-09-11 17:03:16.164 passByValue[1559:403] 5. foo at 0x104c421e8

str のアドレスがメイン関数であり、method1 の str1 のアドレスは、str1 が再割り当てされるまで同じであることに注意してください。これは値渡しの原則に従っていますか?

はい、制御が値渡しの原則に従うメインに戻った後も、str の値とアドレスは同じままです。

したがって、誰でもこれを説明できますか、または str が参照ではなく値で渡されるという事実を受け入れる必要があります。

4

2 に答える 2

3

まず第一に、「オブジェクト」はObjective-Cの値ではありません。「オブジェクト」型の式を持つことはできません。次のようなことをすると、コンパイラは文句を言います。

NSString foo;

むしろ、オブジェクトポインタしか持てません。オブジェクトに対して実行できることはすべて、オブジェクトポインタを介して実行します。コードでstrstr1、、などはオブジェクトポインタ変数です。

それが邪魔にならないので、Objective-Cは確かに常に値渡しです。「オブジェクト」が渡されたり割り当てられたりしないため、あなたの質問は実際には意味がありません。(「オブジェクト」はそもそも値ではありません。)この例では、メソッドはオブジェクトポインタを取ります。

値渡しの場合と同様に、ローカル変数への割り当ては外部コードに影響を与えません。

于 2012-09-11T18:27:05.483 に答える
1

実際、オブジェクト パラメーターが実際に値渡しされる場合は、まったく逆の動作が見られます。のアドレスがandstr1で同じであるのは、それらが参照渡しされているためです。同じポインターへの2 つの参照 ( and ) があるだけです。mainmethod1strstr1

于 2012-09-11T11:05:11.627 に答える