2014-11-18 2 views
0

Я изучаю классы в Objective-C. Я создал класс под названием «CurrencyConverter».Создание экземпляра класса Возвращает предупреждение?

По моим сведениям, существует несколько способов создать экземпляр этого класса в другом файле. Так что в моем AppDelegate.h, я создал экземпляр с помощью переменной типа «идентификатор» как так:

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 

id currencyConverter; 

} 

Так что в моем AppDelegate.m я могу объявить, как это без всякого предупреждения:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

// Override point for customization after application launch. 

currencyConverter = [[CurrencyConverter alloc] init]; 

return YES; 

} 

Однако, когда я создаю экземпляр моего класса, как в следующем, я получаю предупреждение о том, «Неиспользованные переменной: myCC»

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

// Override point for customization after application launch. 

CurrencyConverter *myCC = [[CurrencyConverter alloc] init]; 

return YES; 

} 

Обратите внимание, что я не создать экземпляр «myCC» в Appdelegate.h , Я только сделал это для «currencyConverter». Также обратите внимание, что я сделал

#import "CurrencyConverter.h" 

В верхней части моего Appdelegate.m

Так что мой вопрос, как пришел один из способов создания экземпляра класса не предупреждение, а другой один делает? Разве они не как технически неиспользованные? ...

+0

Пожалуйста, ознакомьтесь, пожалуйста, как программировать, прежде чем начать с Objective-C !!! У вас здесь есть серьезные заблуждения! Objective-C не является языком новичка! –

+0

'id currencyConverter;' не создает экземпляр. 'currencyConverter = [[CurrencyConverter alloc] init];' не является объявлением. –

+0

Извините, я думаю, у меня пока нет имен вещей. Но эй, не могу винить меня за то, что я пытаюсь быть самоучкой:/ –

ответ

2
CurrencyConverter *myCC = [[CurrencyConverter alloc] init]; 
return YES; 

Переменная myCC в вышеуказанном является локальной переменным. Он живет только до тех пор, пока этот метод. Но метод заканчивается в следующей строке без дальнейшего упоминания myCC, поэтому создание было бессмысленным; он появляется и снова исчезает (и это делает этот CurrencyConverter).

(В другом коде, myCC является экземпляр переменной, поэтому его значение - другой CurrencyConverter - сохраняется после создания и возложенные на него в любом случае, Objective-C компилятор никогда не будет жаловаться на неиспользуемую, например. переменная, так как это понятие ничего не значит.)

+0

Так что «currencyConverter» - это переменная, которую я могу использовать во всем этом файле и в различных методах в этом файле, потому что я создал экземпляр этого в моем .h? –

+0

Не потому, что вы создали его в своем _.h_. Потому что вы объявили его как переменную экземпляра. Вы можете сделать это в своем _.h_ или в своем _.m_. Переменная экземпляра является глобальной для всех методов этого экземпляра; это часть того, что должно быть переменной экземпляра. – matt

+0

Ahh ... я вижу. Благодаря! –

0

Вам нужно узнать о переменных стека и кучи, а также переменных локальных переменных и переменных экземпляра.

Когда вы вызываете метод, переменные, объявленные между скобками «{» и «}», являются ЛОКАЛЬНЫМИ переменными. Они существуют только для жизни метода. Эти переменные объявляются в «стеке».

Подумайте о стеке как стек листов бумаги для заметок. Когда вы вызываете метод, процессор кладет новый пустой лист бумаги в стек и использует этот лист бумаги для хранения всех локальных переменных из вашего метода. Когда вы дойдете до закрывающей скобки ("}"), метод вернется, и процессор берет лист бумаги этого метода со стека и отбрасывает его. Любая информация на этом листе бумаги теряется.

На самом деле, в любое время, когда вы используете открывающую скобу, компилятор удаляет новый чистый лист бумаги, а любые переменные, которые вы объявляете, добавляются на новый чистый лист бумаги. Когда вы попадаете в подходящую закрывающую скобу, верхний лист бумаги отбрасывается, и любые переменные, которые были объявлены между внутренними наиболее открывающимися и закрывающимися скобами, отбрасываются. Набор фигурных скобок определяет «локальный масштаб». Любые переменные, объявленные внутри этих фигурных скобок, видны только внутри фигурных скобок и только EXIST внутри фигурных скобок. Как только программа выйдет из закрывающей скобки, все переменные, определенные между открывающей и закрывающей скобкой, будут отброшены.

Стек такой же, но память компьютера. Стек больше похожа на стек пустых накопителей. Когда компьютер сначала запускается, все кубы пусты. Существует указатель стека, указывающий на первый пустой куб (расположение памяти) в верхней части стека. Если вы нажмете что-то в стек, он будет храниться в пустом кубе, а указатель стека будет перемещен до следующего пустого куба. Если вы выталкиваете что-то из стека, он извлекается из первого непустого кубика в верхней части стека, и указатель стека падает вниз, чтобы указывать на теперь пустой куб. Когда вы возвращаетесь из метода или выходите из набора фигурных скобок, компилятор помнит, сколько стекового пространства вы использовали, и выталкивает все, что вы храните со стека, и выбрасывает его.

Переменные экземпляра разные. Они хранятся в куче, которая является блоком памяти, который хранится в течение всей жизни вашей программы. Когда вы создаете объект, процессор вырезает блок памяти из кучи, достаточно большой для вашего объекта, и передает вам указатель на эту память. Затем вы инициализируете свой объект, который устанавливает память в «чистом» состоянии запуска. Если вы отпустите объект, этот бит памяти кучи освободится. Место хранения в куче не сверху вниз. Это больше похоже на первое пришествие, сначала поданное. Если вы создадите 10 объектов, а затем освободите 4 из них, в памяти стека будут дыры, в которых эти 4 объекта были раньше. Кучевое пространство больше похоже на столы в ресторане. Если вы запрашиваете блок памяти, ОС ищет свободный блок памяти на куче, достаточно большой (или больше) размер, который вы просили, так же, как в ресторане сидят группы людей на самом маленьком столе, который достаточно большой, чтобы посадите всю группу, даже если стол немного больше, чем группа.

Смежные вопросы