Objective-C: невозможно изменить значение переменной экземпляра внутри функции - PullRequest
0 голосов
/ 17 июня 2010

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

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

//  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

Я вызываю функцию myFunction с параметром temObj, который является экземпляром NSMyObject.

myFunction(temObj);//temObj is NSMyObject

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

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

... ожидая, что это изменит содержание temObj.

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

Приветствую любой комментарий

Спасибо

Ответы [ 3 ]

1 голос
/ 17 июня 2010

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

Я думаю, что ваша проблема в том, что 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 голос
/ 17 июня 2010

Я не вижу проблем с этим.

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

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

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

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

0 голосов
/ 17 июня 2010

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

@property(nonatomic, readwrite) NSInteger i;

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

@synthesize i;

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

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

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

...