2013-01-16 96 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