如何简单地从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?
答
- 您声明了一个属性,然后在Object.h中显式声明访问器。你只需要做一个或另一个 - 他们的意思是相同的(好吧,几乎 - 你将有
color
而不是getColor
) - 要实现Object.m中的属性,您应该使用
@synthesize color
。显式实现又是多余的(除非它们做了额外的事情)。 - Object.m中明确的
setColor
实现调用了属性 - 您明确实现了该属性,所以我希望您在此处获得无限递归。 - MyViewController.m应该可能合成
label1
,因为您在标头中声明属性(尽管它没有在您的代码段中使用)。 - [myObject getColor]正在调用您声明但未合成的颜色属性。如果你明确地实现它作为
color
它会选择这个 - 但它不会匹配getColor
(幸运的是,因为这将导致无限递归。 - 我没有看到任何地方你创建你的myObject的实例。如果没有这将是
nil
和方法调用了它(包括属性访问)将返回0或零。
我怀疑(6)是你的问题的原因,但其他人需要请确保你阅读了属性语法
并且'@synthesize myObject;'的使用暗示了对创建对象实例的误解与综合房产访问者相比。 +1阅读属性语法的想法。 – 2010-04-07 15:24:50
...以下是参考链接:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – jlehr 2010-04-07 16:01:02
开始一种方法通常也是一个坏主意用大写字母命名,就像你用+ Object方法完成的一样。 – jlehr 2010-04-07 16:04:53