例如,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;
}
答案 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)
对于您的情况,永远不要发布使用@""
语法创建的任何字符串。它们是内存中的常量,在应用程序进程结束之前不应该取消分配。