Как передать значения по ссылке в объекте C (iphone)
У меня есть очень простой вопрос. Я новый программист на iPhone.
Мой вопрос в том, может ли кто-нибудь сказать мне, как я могу передавать значения по ссылке на функцию в obj. C? Я знаю, как это сделать в VB и С#. Но не знаю, как это сделать в Obj c.
Спасибо
Ответы
Ответ 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;
}