Как я могу просто изменить переменную класса из другого класса в ObjectiveC? - PullRequest
1 голос
/ 07 апреля 2010

Я просто хочу изменить переменную объекта из другого класса.Я могу скомпилировать без проблем, но моя переменная всегда имеет значение «ноль».Я использовал следующий код:

Object.h:

@interface Object : NSObject {
    //...
    NSString *color;
    //...
}

@property(nonatomic, retain) NSString* color;

+ (id)Object;
- (void)setColor:(NSString*)col;
- (NSString*)getColor;
@end

Object.m:

+(id)Object{
    return [[[Object alloc] init] autorelease];
}

- (void)setColor:(NSString*)col {
    self.color = col;
}

- (NSString*)getColor {
    return self.color;
}

MyViewController.h

#import "Object.h"

@interface ClassesTestViewController : UIViewController {
    Object *myObject;
    UILabel *label1;
}

@property UILabel *label1;
@property (assign) Object *myObject;
@end

MyViewController.m:

#import "Object.h"
@implementation MyViewController
@synthesize myObject;

- (void)viewDidLoad {
    [myObject setColor:@"red"];
    NSLog(@"Color = %@", [myObject getColor]);
    [super viewDidLoad];
}

Сообщение NSLog всегда Color = (null)

Я пробовал много разных способов решить эту проблему, но безуспешно.Буду признателен за любую помощь.


Спасибо за помощь.

Я изменил код следующим образом, но он все еще не работает, как следует.

MyViewController.h:
    #import <UIKit/UIKit.h>
    #import "Object.h"

    @interface MyViewController : UIViewController {
        Object *myObject;
    }
    @property (nonatomic, retain) Object *myObject;
    @end

MyViewController.m:

#import "MyViewController.h"
#import "Object.h"

@implementation MyViewController
@synthesize myObject;

- (void)viewDidLoad {
Object *myObject = [Object new];
myObject = 0;
[myObject setColor:@"red"];
NSLog(@"color = %@", myObject.color);
[super viewDidLoad];
}

Если я сделаю это так, NSLog вернет color = null (и я думаю, что myObject виден только в viewDidLoad).Как можно объявить myObject и сделать его видимым в MyViewController?Я сократил свой класс Object до

Object.h:

@interface Object : NSObject {
    NSString *color;
}    
@property(nonatomic, retain) NSString *color;
@end

Object.m:

#import "Object.h"
@implementation Object
@synthesize color;
@end

Я не смог определить объект myObject в ViewDidLoad, чтобы я мог получить доступ к его свойствам из всего класса ViewController?Что я упустил?Дополнительный вопрос: почему я должен установить myObject на 0?

1 Ответ

3 голосов
/ 07 апреля 2010
  1. Вы объявляете свойство, а затем явно объявляете методы доступа в Object.h.Вам нужно только сделать одно или другое - они означают одно и то же (ну, почти - у вас будет color вместо getColor)
  2. Для реализации свойства в Object.m вы должны использовать@synthesize color.Явные реализации, опять же, тогда избыточны (если они не делают ничего лишнего).
  3. Явная реализация setColor в Object.m вызывает свойство - которое вы реализуете явно, поэтому я бы ожидал, что вычтобы получить бесконечную рекурсию здесь.
  4. MyViewController.m, вероятно, должен синтезировать label1, поскольку вы объявляете свойство в заголовке (хотя оно не используется в вашем фрагменте).
  5. [myObjectgetColor] вызывает свойство цвета, которое вы объявили, но не синтезировали.Если бы вы в явном виде реализовали его как color, он бы это понял, но он не будет совпадать с getColor (к счастью, это привело бы к бесконечной рекурсии снова.
  6. Я не знаюнигде не видно, где вы создаете свой экземпляр myObject. Если вы этого не сделаете, это будет nil, и методы, вызываемые для него (включая доступ к свойствам), вернут 0 или ноль.

Я подозреваю (6) является причиной вашей проблемы, но к другим тоже нужно обратиться. Убедитесь, что вы ознакомились с синтаксисом свойства.

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