objective-c何时应该释放静态局部变量

时间:2011-06-05 08:53:28

标签: iphone objective-c xcode4

例如,NSString * defaultCellIndentifier = @“HelloWorld”;

我什么时候应该解除分配?字符串是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;
    }

2 个答案:

答案 0 :(得分: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.
}

但是一旦创建,就不应该再次触摸静态变量。如果您发现需要更改它,则应在类上使用实例变量,而不是使用静态变量。

还有关于多线程的警告:如果你有多个线程,你应该确保在多个线程可能访问它之前完成静态变量的初始化。因为如果两个线程都会看到未初始化的(零)变量,那么它们都会尝试设置新值(竞争条件),理论上甚至可能导致崩溃。一旦变量被初始化并且您只读取变量(并且它不是可变对象),就可以安全地从不同的线程访问该值。

答案 1 :(得分:3)

对于您的情况,永远不要发布使用@""语法创建的任何字符串。它们是内存中的常量,在应用程序进程结束之前不应该取消分配。