2011-06-05 53 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

对于你的情况,绝不会透露@""语法创建的任何字符串。它们是内存中的常量,在应用程序进程结束之前不应该释放。