如何在目标C(iphone)中通过引用传递值

42 objective-c

我有一个非常基本的问题.我是一名新的iPhone程序员.我的问题是,任何人都可以告诉我如何通过引用obj中的函数来传递值.C?我知道如何在VB和C#中做到这一点.但不知道如何在Obj c中做到这一点.

谢谢

Dar*_*ren 90

Objective-C中的传递引用与C中的相同.

相当于以下C#代码:

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

MyClass bar = new MyClass();
this.nullThisObject(ref bar);
assert(bar == null);
Run Code Online (Sandbox Code Playgroud)

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

MyClass* bar = [[MyClass alloc] init];
[self nilThisObject:&bar];
NSAssert(bar == nil);
Run Code Online (Sandbox Code Playgroud)

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

int myNum;
[self zeroThisNumber:&myNum];
NSAssert(myNum == 0);
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了请纠正我!但我认为在上面的"zeroThisNumber"示例中,指针传递**值**,意味着指针的副本被传递,即如果我们将`num`更改为指向另一个int的`myNum`将**不会**改变.按惯例,我们称"通过引用"具有原始obj的地址,我们可以直接更改它(通过解除引用). (7认同)
  • 在zeroThisNumber示例中,num通过引用传递(尽管从技术上讲,这不是C++的引用含义).在此示例中,num的值的地址传递给zeroThisNumber.这允许在方法中更改值,并在调用者中反映该更改.你所指的是对参考的引用......因为它是......双重间接.如果num没有通过引用传递,则num的值将被复制并放置在堆栈中.zeroThisNumber中num的任何更改都将在堆栈上进行,并在方法返回时丢失. (2认同)

ttv*_*tvd 13

目标C中没有通过引用传递(在C++意义上).您可以通过指针传递对象,按值传递原始类型.

例:

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

void func(NSInteger myint)
{
 ...
}

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

func(str);
func(num); 
Run Code Online (Sandbox Code Playgroud)


Pet*_*wis 13

如果您使用Objective C++,您可以通过使用扩展名.mm命名文件,或者告诉Xcode将所有源代码编译为Objective C++,那么您可以像使用C++一样传递引用,例如:

- (OSStatus) fileFileInfo: (FileInfo&)fi;
Run Code Online (Sandbox Code Playgroud)


小智 6

试试这种方式:

    -(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
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!!