Как передать значения по ссылке в объективе C (iphone) - PullRequest
42 голосов
/ 28 августа 2009

У меня очень простой вопрос. Я новый программист iPhone. Мой вопрос, может кто-нибудь сказать мне, как я могу передать значения по ссылке на функцию в obj C? Я знаю, как это сделать в VB и C #. Но не знаю, как это сделать в Obj c.

Спасибо

Ответы [ 6 ]

90 голосов
/ 28 августа 2009

Передача по ссылке в Objective-C такая же, как и в 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);

и

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

int myNum;
[self zeroThisNumber:&myNum];
NSAssert(myNum == 0);
13 голосов
/ 28 августа 2009

Если вы используете Objective C ++, что можно сделать, назвав свой файл с расширением .mm, или указав Xcode для компиляции всего исходного кода как Objective C ++, тогда вы можете передавать ссылки так же, как вы делаете с C ++, например:

- (OSStatus) fileFileInfo: (FileInfo&)fi;
13 голосов
/ 28 августа 2009

В Objective C. нет передачи по ссылке (в смысле C ++). Вы можете передавать объекты по указателю, а примитивные типы - по значению.

Пример:

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

void func(NSInteger myint)
{
 ...
}

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

func(str);
func(num); 
6 голосов
/ 22 ноября 2012

Попробуйте так:

    -(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
    }

Надеюсь, это поможет !!

0 голосов
/ 14 апреля 2012

У вас должен быть аргумент, если вы хотите получить более одного адреса из полученного вызова функции. Вместо этого вы можете сделать это, создав класс-обертку и передав его. Например:

@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;
}
0 голосов
/ 28 августа 2009

Это зависит от того, что вы имеете в виду. Наиболее близкая вещь C (и, следовательно, Objective-C) к ссылочному типу - это указатели. Как следует из названия, указатели указывают на данные, которые существуют где-то еще. Чтобы получить указанную вещь, вы должны разыменовать указатель. К объектам в Objective-C никогда не обращаются напрямую - вы всегда используете указатели, чтобы общаться с ними. Вы также можете передавать указатели на другие типы, кроме объектов.

Указатели - сложная тема. Я определенно рекомендовал бы читать на C, чтобы почувствовать их.

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