如何简单地从ObjectiveC中的另一个类中更改类变量?

问题描述:

我只是想改变另一个类的对象的变量。我可以编译没有问题,但我的变量总是被设置为'null'。 我用下面的代码:如何简单地从ObjectiveC中的另一个类中更改类变量?

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.h:

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

Object.m:

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

我没能在viewDidLoad中定义一个对象myObject让我能从整个ViewController类访问它的属性?我错过了什么?侧边问题:为什么我必须将myObject设置为0?

  1. 您声明了一个属性,然后在Object.h中显式声明访问器。你只需要做一个或另一个 - 他们的意思是相同的(好吧,几乎 - 你将有color而不是getColor
  2. 要实现Object.m中的属性,您应该使用@synthesize color。显式实现又是多余的(除非它们做了额外的事情)。
  3. Object.m中明确的setColor实现调用了属性 - 您明确实现了该属性,所以我希望您在此处获得无限递归。
  4. MyViewController.m应该可能合成label1,因为您在标头中声明属性(尽管它没有在您的代码段中使用)。
  5. [myObject getColor]正在调用您声明但未合成的颜色属性。如果你明确地实现它作为color它会选择这个 - 但它不会匹配getColor(幸运的是,因为这将导致无限递归。
  6. 我没有看到任何地方你创建你的myObject的实例。如果没有这将是nil和方法调用了它(包括属性访问)将返回0或零。

我怀疑(6)是你的问题的原因,但其他人需要请确保你阅读了属性语法

+0

并且'@synthesize myObject;'的使用暗示了对创建对象实例的误解与综合房产访问者相比。 +1阅读属性语法的想法。 – 2010-04-07 15:24:50

+0

...以下是参考链接:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – jlehr 2010-04-07 16:01:02

+0

开始一种方法通常也是一个坏主意用大写字母命名,就像你用+ Object方法完成的一样。 – jlehr 2010-04-07 16:04:53