2011-06-05 83 views
1

例如,NSString * defaultCellIndentifier = @「HelloWorld」;objective-c何時應該釋放靜態局部變量

什麼時候應該取消分配?字符串是Objective-C中唯一可以變爲靜態的變量嗎?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     [BNUtilitiesQuick UtilitiesQuick].currentBusiness=[[BNUtilitiesQuick getBizs] objectAtIndex:[indexPath row]]; 
     //Business * theBiz=[[BNUtilitiesQuick getBizs] objectAtIndex:[indexPath row]]; 
     static NSString * defaultCellIndentifier = @"HelloWorld"; 
     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier: defaultCellIndentifier]; 
     //UITableViewCell*cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Hello"] autorelease];; 
     ... 



     return cell; 
    } 

回答

4

在這種情況下,您不能真正釋放對象,因爲它是一個靜態字符串,它位於程序的只讀部分,映射到內存中。做[@"foo" release]沒有效果。您只能將nil分配給您的變量,但這不會使字符串消失。

一般來說,靜態變量的要點是堅持,所以你不想釋放它。只要它不是一個只能增長並佔用大量內存的可變數組,這不成問題。

編輯澄清:

通常情況下,你使用一個靜態變量分配的東西,應該是或多或少是靜態的一次。一個靜態變量共享與所有實例,所以如果你改變它,你的類的所有實例將看到這種變化。特別是隨着多線程這可能是一個問題,但它通常是安全的,做到這一點:

- (void)foo 
{ 
    // It's important to initialize this to nil. This initialization 
    // is only done ONCE on application start ! It will NOT overwrite 
    // any values you've set later on. 
    static NSDate *someImportantDate = nil; 

    if (!someImportantDate) { 
     // Allocate the static object. We will only get here once. 
     // You need to make sure that the object here is not autoreleased ! 
     someImportantDate = [[NSDate alloc] init]; 
     // or: 
     someImportantDate = [[NSDate date] retain]; 
    } 

    // Do stuff. 
} 

但是一旦創建,你不應該再次觸摸靜態變量。如果您發現需要更改它,則應該在您的類上使用實例變量,而不是使用靜態變量。

另外一個關於多線程的警告:如果你有多線程,你應該確保在多線程可能訪問它之前完成靜態變量的初始化。因爲如果兩個線程都會看到未初始化的(nil)變量,他們都會嘗試設置理論上甚至可能導致崩潰的新值(競爭條件)。一旦變量被初始化,並且只有讀取變量(並且它不是可變對象),從不同線程訪問該值是安全的。

+0

那麼如果它不是NSString *,但NSDate *看起來像它被取消分配無論如何。只有NSString *可以是靜態的,不是嗎? – 2011-06-05 11:44:00

+0

@Jim Thio:看到編輯,我希望它解釋它。 – DarkDust 2011-06-05 12:01:58

3

對於你的情況,絕不會透露@""語法創建的任何字符串。它們是內存中的常量,在應用程序進程結束之前不應該釋放。