2013-01-16 66 views
1

我是初学者ObectiveC用户,请保留简单的答案。我有相当多的C和C++经验。ObjectiveC - 构造函数,内存管理

现在,使用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

问题是您在{@implementation中的字段周围丢失{}。 – Jano

+0

Jano,thx!原因是缺少{}字段。谢谢! – Sid

+0

我正在考虑没有{}的代码是如何被编译器解释的。为什么编译器没有显示任何警告......我不确定我是否可以理解潜在的答案(初学者Objective-C),但它确实很有趣。 – Sid

回答

3

我问在Twitter和得到了@Bavarious如下评论:的@interface … {}@implementation … {}之外声明的任何变量被当作一个常规的C变量

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

。 在你的榜样,_excerpt 是静态存储时间和 全局(文件范围)变量同样可被放置在文件的顶部 @interface之前,或@interface@implementation,或两种方法的实现之间 之间 - 这是相同的机制 其中C中的文件范围变量定义在函数 块之外。

具有静态存储持续时间的变量可用于实现类变量,这是Objective-C中不存在的一个概念。

+0

现在一切都很清晰! :-) – Sid

2

您的变量定义为global variables(而不是实例变量),这就是为什么它们具有与您的实例相同的相同值。

将它们嵌入到{}中是一种可行的解决方案。

+0

这是真的。谢谢! – Sid

+0

对不起,它不是类变量。就像Jano说的那样,它是全局变量。关于Obj-C中的“类变量”的更多信息:http://jongampark.wordpress.com/2009/04/25/class-variable-for-objective-c-and-c/ – Sid