target-c, когда мы должны освободить статическую локальную переменную - PullRequest
1 голос
/ 05 июня 2011

Например, NSString * defaultCellIndentifier = @ "HelloWorld";

Когда я должен освободить это? Являются ли строки единственной переменной в target-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 ]

4 голосов
/ 05 июня 2011

В этом случае вы не можете по-настоящему освободить объект, так как это статическая строка, которая находится в секции только для чтения вашей программы, которая отображается в памяти.Выполнение [@"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) переменную, они оба попытаются установить новое значение (состояние гонки), которое теоретически может даже привести к сбою.Как только переменная инициализирована и вы только читаете переменную (и это не изменяемый объект), можно безопасно получить доступ к значению из разных потоков.

3 голосов
/ 05 июня 2011

В вашем случае никогда не выпускайте любых строк, созданных с синтаксисом @"".Они являются константами в памяти и никогда не должны быть освобождены, пока не завершится процесс приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...