Objective C - 构造函数,内存管理

时间:2013-01-16 10:17:24

标签: objective-c memory

我是初学者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”的值。但它不是那样的。为什么?哪里出错? 请帮助和谢谢!

2 个答案:

答案 0 :(得分:3)

我在推特中问过并从@Bavarious获得以下评论:

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

  

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

     

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

答案 1 :(得分:2)

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

将它们嵌入{}是您可能的解决方案。