Передача аргументов относительно Ивара - PullRequest
0 голосов
/ 15 января 2011

Я передаю iVar в функцию.IVar является двойным.Значение iVar внутри функции является правильным, но значение iVar вне функции не изменяется.Это должно быть связано с тем, как я получаю iVar в функцию.Как передать двойной iVar, чтобы его значение изменялось в объекте, а не только в функции?Я делаю то же самое с указателями, и результаты ожидаются, поэтому я не понимаю скалярную передачу аргументов в c / target-c.

Код выглядит так: .h

    @interface myClass: NSObject
    {
        double myDouble;
    }

        - (void)func1;
        - (void)func2: (double)myDouble;

.m

- (void)func1 {
myDouble = 1.2
NSLog(@"Before func2 myDouble = %f", myDouble);
[self func2: myDouble];
NSLog(@"After func2 myDouble = %f", myDouble);
}

- (void)func2: (double)adouble
{
NSLog(@"In func2 before operation adouble = %f",adouble);
NSLog(@"In func2 before operation myDouble = %f", myDouble);
adouble = 3.4;
NSLog(@"In func2 after operation adouble = %f",adouble);
NSLog(@"In func2 after operation myDouble = %f", myDouble);
}

приводит к:

До func2 myDouble = 1.2

В func2 до операции adouble = 1.2

В func2до операции myDouble = 1.2

в func2 после операции adouble = 3.4

в func2 после операции myDouble = 1.2

после func2 myDouble = 1.2

Ответы [ 3 ]

4 голосов
/ 15 января 2011

Я предполагаю, что ваша функция сейчас выглядит примерно так:

void doSomethingWithDouble(double number) {
    number = number *2;
}

Если вы хотите, чтобы функция напрямую модифицировала double, то вы должны изменить это на:

void doSomethingWithDouble(double *number) {
    *number = *number / 2.0;
}

Это изменяет переданное значение, но вы должны передать указатель. Примером этого может быть:

double test = 2.0;
doSomethingWithDouble(&test);

Кстати, все это просто C, а не Objective-C.

1 голос
/ 15 января 2011

@ Стефан не совсем прав; значение типа double передается по значению не потому, что это не тип указателя, а потому что все передается по значению в C и Objective-C. Вы можете думать о передаче параметров как об инициализации локальной переменной. Используя ваш оригинальный myClass и func2 и объявления:

myClass anInst = [myClass new];
double someNum = 4.2;

тогда звонок:

[anInst func2:someNum];

оценивается как:

[myClass func2:someNum];
=> enter a new method(function) scope, creating the local vars of func2
   adouble = someNum; // that is func2's adouble and the callers someNum
                      // only the value in someNum is copied into adouble
   adouble = 3.4;     // the body of func2 - this has no effect on someNum
<= return from func2's scope
// someNum has not changed

То же самое произошло бы, если бы параметр имел тип указателя, единственное отличие состоит в том, что хотя вы передаете указатель по значению, вы можете изменять содержимое объекта / переменной / памяти, на которое ссылается значение указателя, - но вы все равно не меняйте указатель.

C ++ (и Objective-C ++) поддерживают передачу по ссылке, но это уже другая тема ...

0 голосов
/ 15 января 2011

Double не является указателем и поэтому передается по значению.Вам нужно будет использовать тип указателя, такой как NSNumber, для того, чтобы изменение было вызвано в вызывающей функции.

EDIT:

Но, как указал @Tom Dalling, NSNumber является неизменным.поэтому вам может потребоваться, чтобы ваша функция возвращала нужное вам значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...