2010-06-17 2 views
0

Я не могу изменить значение переменной экземпляра внутри функции.Objective-C: Невозможно изменить значение переменной экземпляра внутри функции

Я определил класс:

// info.h 
#import <Foundation/Foundation.h> 

@interface NSMyObject : NSObject 
{ 
    NSInteger i; 
} 

-(void) setI:(NSInteger)v; 

@end 

#import "info.h" 

@implementation NSMyObject 

-(void) setI:(NSInteger)v ; 
{ 
    i=v;  
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

я называю функцией «туРипсЫоп» с параметром temObj который является экземпляром NSMyObject.

myFunction(temObj);//temObj is NSMyObject 

В функции, можно изменить значение переменной экземпляра параметра obj.

-(void)myFunction:(NSMyObject*) obj; 
{ 
    [obj setI:0]; 
} 

... ожидал этого, чтобы изменить содержание temObj.

Но когда я проверяю результаты работы на obj в функции myFunction, значение temObj.i не изменилось.

Добро пожаловать любой комментарий

Благодарности

ответ

1

Вы должны иметь возможность изменить значение атрибута переданного объекта внутри функции или метода.

Я думаю, ваша проблема в том, что myFunction в коде выше не определен как функция, а скорее метод экземпляра класса. Он не будет работать автономно, как это:

myFunction(temObj); 

... вместо этого вы должны назвать это нравится:

[someInstanceOfAClass myFunction:tempObj]; 

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

При вызове метода правильно, вы должны быть в состоянии сделать это:

-(void)myFunction:(NSMyObject*) obj; 
{ 
    [obj setI:0]; 
    NSLog(@"obj.i = %d",obj.i); 
} 

... и увидеть значение obj.i вы просто набор выводимой на консоль.

Если вы вызываете его правильно, но значение obj.i по-прежнему не изменяется, наиболее вероятным объяснением является то, что вы смотрите на другой экземпляр NSMyObject, а не тот, который вы передали методу.

1

Я не вижу никакой проблемы, делая это.

Однако есть проблемы с вашим кодом - не технически, а условно.

Вы не должны указывать свои собственные объекты NS - это префикс рамки Foundation для Apple.

Вы должны префикс своих собственных классов с аббревиатурой вашего имени, или именем приложения или названием вашей компании и т.д.

Apple, использует множество префиксов для их структур и если вы используете одни и те же префиксы, вы будете в конечном итоге столкновение между именами классов.

0

Я не вижу никакой проблемы синтаксиса в коде, но вы можете следовать рекомендуемой практики, как вы можете сделать свойство для переменной как:

@property(nonatomic, readwrite) NSInteger i; 

И чем в реализации класса сделать его синтезировать, как

@synthesize i; 

Теперь, когда вы собираетесь установить значение в методе ваш код должен делать эту работу:

-(void)myFunction:(NSMyObject*) obj; 
{ 
    [obj setI:0]; 
} 

Еще одна вещь, попробуйте использовать некоторые стандартные и рекомендуемые условные обозначения, иногда имена - это ключевые слова, и они вызывают проблемы, даже если они не дают никаких ошибок или предупреждений во время компиляции.

Смежные вопросы