我是初学者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”的值。但它不是那样的。为什么?哪里出错? 请帮助和谢谢!
答案 0 :(得分:3)
我在推特中问过并从@Bavarious获得以下评论:
https://gist.github.com/11c22c0edea5391a3799(加粗)
在
@interface … {}
或@implementation … {}
之外声明的任何变量都被视为常规C变量。 在您的示例中,_excerpt
是一个具有静态存储持续时间的全局(文件范围)变量 可以等效地放在文件的顶部@interface
,或@interface
和@implementation
之间,或 两种方法的实现之间 - 它是相同的机制 其中C中的文件范围变量是在函数之外定义的 块。具有静态存储持续时间的变量可用于实现类 变量,Objective-C中不存在的概念。
答案 1 :(得分:2)
您的变量定义为global variables
(而不是实例变量),这就是它们具有从您的实例引用的相同值的原因。
将它们嵌入{}是您可能的解决方案。