Цель c - int и char [] объявлена ​​в .h, жизненный цикл? - PullRequest
0 голосов
/ 11 октября 2011

Некоторое время я боролся с памятью моего приложения (alloc, retain, release и т. Д.), Но есть кое-что, что я не до конца понял.

Если я объявлю это в моем .h файле:

int ex1;
char ex2[10];

Каков жизненный цикл этих переменных? Представьте, что я хочу использовать эти переменные в разных частях моего кода .m, в методе A я собираюсь присвоить значение, а в методе B я собираюсь прочитать их.

Могу ли я быть на 100% уверен, что переменные не будут освобождены в любой момент моего .m?

Спасибо

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Вы не должны объявлять переменные в файле .h, так как это может привести к ошибкам компоновщика.

скорее вы должны extern-объявить их в файле .h и правильно объявить их в файле .c / .m. Например:

// In the .h

extern int ex1;
extern char ex2 [10];

// In the .c/.m

int ex1;
char ex2;

Причина в том, что несколько .c файлов могут содержать ваш заголовок, и у вас будет несколько определений одних и тех же переменных.

Кроме того, помните, что Objective-C является строгим надмножеством C. Это означает, что все, что работает в C, работает точно так же в Objective-C. Вам нужно беспокоиться только о сохранении / выпуске / автоматическом выпуске объектов Objective-C, в основном всего, что использует этот синтаксис:

@interface MyObject : NSObject
{
    // My vars
}

@end
1 голос
/ 11 октября 2011

Так как они примитивы, да. Они не будут сохранены или освобождены. Если вы хотите объявить их как свойства, вы должны объявить их как:

@property (assign) int ex1;

и

@property (assign) char ex2[10];

Тогда в вашем .m файле @synthesise их как обычно, и вы сможете использовать [myObject ex1] и [myObject ex2]

Идея действительно довольно проста в Цели C -

  • если вы когда-либо вызываете alloc для объекта, тогда вы отвечаете за вызов release для него.
  • Если вы когда-либо вызываете retain для объекта, вы отвечаете за вызов release для него.
  • Если вы хотите убедиться, что уведомление об освобождении из-под вас будет другим, а вы не распределились, то вызовите retain для него.

Очевидно, однако, эти правила применяются к указателям на объекты, а не к примитивам типа int или char.

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