Подтвердить что ты не робот

Как передать значения по ссылке в объекте C (iphone)

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

Спасибо

4b9b3361

Ответ 1

Передача по ссылке в 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);

и

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

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

Ответ 2

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

Пример:

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

void func(NSInteger myint)
{
 ...
}

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

func(str);
func(num); 

Ответ 3

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

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

Ответ 4

Попробуйте следующим образом:

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

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

Ответ 5

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

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

Ответ 6

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

@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;
}