2009-07-25 110 views
1

我遇到了一些NSString保留問題。我的問題是,在第二個函數(runItem)它似乎沒有拿起item1的價值。無論我如何設定,它似乎只是設定爲零。我是Cocoa的編程(桌面,與iPhone),我以前沒有與NSString這種類型的問題。我不知道我在做什麼來實現它,所以如果任何人都可以幫助我,我會非常感激!我在我的AppController.h文件代碼:NSString保留問題

@interface AppController : NSObject { 
    NSString *item1; 
} 
@property (retain) NSString *item1; 

- (IBAction)runItem:(id)sender; 

@end 

而且AppController.m:

@synthesize item1; 

- (void)awakeFromNib: { 
    NSDictionary *savedFile = [NSDictionary dictionaryWithContentsOfFile:@"Users/me/Desktop/Testing.plist"]; 
    if (savedFile != nil) { 
     item1 = [savedFile objectForKey:@"Item Title"]; 
     AppController *runFunction = [[AppController alloc] init]; 
     [runFunction runItem:self]; 
    } 
    else { 
     item1 = nil; 
    } 
} 

- (IBAction)runItem:(id)sender 
    NSLog(@"%@", item1); 
} 

回答

5

嗯,雖然在第一個AppController對象設置item1,要創建一個AppController對象(直接,(由所述應用程序創建的,因爲它是用NIB文件相關聯的一個)通過默認「 init「構造函數),其item1從未設置。然後你要求第二個對象的item1,所以當然是nil

也許這是因爲你認爲awakeFromNib在對象初始化時被調用?但這完全不是事實。僅在加載NIB文件時創建的對象纔會調用awakeFromNib

+1

這是正確的,雖然「awakeFromNib」中沒有冒號。 – 2009-07-25 04:57:38

+0

newacct:這很有意義。我將它切換到[self runItem:self],現在它效果很好。謝謝你的幫助! – PF1 2009-07-25 15:53:16

1

你不保留它,因爲你不是通過屬性 - 你直接去分配到實例變量。使用self.item1 = [savedFile objectForKey:@"Item Title"]可以使用該屬性的合成設置器來設置該值,該設置器將保留該設置器。

此外,您應該使用copy而不是retain,其值應符合NSCoding,尤其是當這些值可能是可變的時。字符串就是這樣一種情況:你真的不想在變異的時候保持別人的可變字符串。你想製作自己的副本,以便不管其他對象如何處理字符串,字符串的值都是固定的。

+0

嗨,彼得:謝謝你的建議。我將來肯定會考慮到這一點。但是,對於這個問題,似乎不管我如何保留item1,它仍然不起作用。我將item1的所有實例都更改爲「self.item1」 - 但即使更改了它,它仍然不起作用。即使通過調用[item1 retain],它仍然拒絕保留。 – PF1 2009-07-25 04:52:13

0

需要更多的細節:

  • 你知道awakeFromNib被調用?
  • 你知道savedFile不是零嗎?
  • 您是否知道savedFile中的「Item Title」存在且非零?

而且,簡單地調用item1 = @"something"不會導致在你的@property聲明中定義了它被保留,你需要調用self.item1 = @"something"對要使用的合成屬性,否則你乾脆直接設置指針。

+0

嗨暱稱: 1.是的,awakeFromNib被調用,我再次用NSLog語句檢查。 2.我相信我通過運行「if(savedFile!= nil)」來檢查這一點,但我可能對此有錯。 3.是的,該值存在於文件中。 此外,這對於self.item1部分是有意義的 - 但即使在添加之後,它仍然不起作用。另外,爲了試用它,我調用了[item1 retain]來查看它是否會以這種方式工作,而事實並非如此。所以我在想,出於某種原因,不管你用哪種方式稱呼它,它都不會保留。 – PF1 2009-07-25 04:49:32

2

問題#1:在你提供的例子中,有以下:

- (void)awakeFromNib: { 

NSNibAwaking協議定義僅awakeFromNib。它是極端重要的是要注意最後缺少冒號。如果你的代碼中的這個方法實際上被調用了,那麼這可能是由於一些內部的怪異現象,而不是你應該依賴的東西(除非你可以在某個地方找到它,而我不能)。我對文檔的快速掃描表明,awakeFromNib是唯一可以調用的選擇器。

問題2:

NSDictionary *savedFile = [NSDictionary dictionaryWithContentsOfFile:@"Users/me/Desktop/Testing.plist"]; 

我相當肯定那是你真正的意思是/Users,不Users。這可能意味着savedFile始終是NULL,因爲它永不加載,因此以下if()檢查將始終使用else條件。

問題#3:

item1 = [savedFile objectForKey:@"Item Title"]; 

如果不使用GC,這條線是一個問題,因爲從字典savedFile檢索的對象還沒有被保留。另外,如果item1包含一個指向對象的有效指針,則直接通過覆蓋它而泄漏它。你可能意思是self.item1 =

此行的第二個問題與問題行爲一樣,不能保證savedFile字典中有關鍵字@"Item Title"的對象。如果沒有,它將返回NULL

問題4:

item1 = nil; 

如果item1包含一個有效的指針到一個對象,你剛剛泄露了。你可能意思是self.item1 = nil;