1

我是 ObectiveC 的初学者,所以请保持可能的答案简单。我在 C 和 C++ 方面有几年的经验。

现在,使用 ObjectiveC 我想创建两个对象,而不是使用属性。我的问题是“这里出了什么问题”而不是“如何以不同的方式做”。所以有我的代码:

@implementation News

NSString *_title;
NSString *_excerpt;
NSString *_content;
NSString *_thumbnailURL;
NSString *_date;

-(id)initWithTitle:(NSString *)title excerpt:(NSString *)excerpt content:(NSString*)content thumbnail:(NSString *)thumbnailURL date:(NSString *)date {
    self = [super init];
    if (self) {
        _title = [[NSString alloc] initWithString:title];
        _excerpt = [[NSString alloc] initWithString:excerpt];
        _content = [[NSString alloc] initWithString:content];
        _thumbnailURL = [[NSString alloc] initWithString:thumbnailURL];
        _date = [[NSString alloc] initWithString:date];
    }
    return self;
}

-(void)showData {
    NSLog(@"    title:%@", _title);
    NSLog(@"    excerpt:%@", _excerpt);
    NSLog(@"    thumbnailURL:%@", _thumbnailURL);
    NSLog(@"    date:%@",  _date);
    NSLog(@"    getContent:%@", _content);
}
@end    

现在我想创建两个对象:

News *nws = [[News alloc] initWithTitle:@"title1" excerpt:@"excerpt1" content:@"content1" thumbnail:@"thumbnail1" date:@"date1"];
News *nws2 = [[News alloc] initWithTitle:@"title3" excerpt:@"excerpt3" content:@"content3" thumbnail:@"thumbnail3" date:@"date3"];

之后想显示这个对象里面有什么:

[nws showData];
[nws2 showData];

结果是两个对象内部具有相同的值。全部以“3”结尾。我认为 nws 对象将包含以“1”结尾的值,而 nws2 将包含以“3”结尾的值。但它不是那样工作的。为什么?哪里有错误?请帮忙,谢谢!

4

2 回答 2

2

您的变量被定义为global variables(而不是实例变量),这就是为什么它们具有从您的实例中引用的相同值的原因。

在您的情况下,将它们嵌入 {} 是一种可能的解决方案。

于 2013-01-16T10:45:11.247 回答
2

我在推特上提问并从@Bavarious 得到以下评论:

https://gist.github.com/11c22c0edea5391a3799(加粗)

任何在@interface … {}或之外声明的变量@implementation … {}都被视为常规 C 变量。在您的示例中,_excerpt 是一个具有静态存储持续时间的全局(文件范围)变量,并且可以等效地放置在文件的顶部 before @interface或 between @interfaceand@implementation或在两个方法的实现之间 - 它与文件范围变量的机制相同C 在功能块之外定义。

具有静态存储时长的变量可以用来实现类变量,这是Objective-C中不存在的概念。

于 2013-01-16T14:02:16.797 回答