Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
#1

Освобождение памяти - Objective-C

05.11.2012, 10:37. Просмотров 1113. Ответов 5
Метки нет (Все метки)

Вопрос по примеру из книги Кочана С. "Программирование на Objective-C 2.0" (с. 153 если что ) Сейчас нету возможности проверить код, т.к нету компилятора.
Есть кусок следующего кода:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Fraction *aFraction = [[Fraction alloc]init];
Fraction *sum = [[Fraction alloc]init], *sum2;
int i, n, pow2;
[sum setTo: 0 over: 1]; //задаём дробь через метод, объявленный в хедере
//задаём n
pow2=2;
for (i=1; i<=n; ++i)
{
[aFraction setTo:1 over: pow2];
sum2 = [sum add: aFraction]; //сложение дробей
[sum release];
sum=sum2;
pow2 *=2;
}
//кодим всякую ересь
[aFraction release];
[sum release];
//и ещё немного ереси
}
Вопросы:
1. Почему мы освобождаем память для sum в цикле? Почему нельзя написать
Objective-C
1
sum = [sum add: aFraction];
2. Можно ли не выделять память для sum? Зачем мы вообще это делаем тут? Тогда можно было бы не объявлять переменную sum2 и делать так, как я показал в первом своём вопросе
3. Отдельный вопрос по указателям. Я с ними и в с++ путаюсь. Почему нельзя просто объявить
Objective-C
1
Fraction aFraction, sum
Почему именно указатели? Объясните, если несложно, т.к сколько не пытался разобраться никак не доходит толком
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 10:37     Освобождение памяти
Посмотрите здесь:

Освобождение памяти - Turbo Pascal
При работе со спрайтами после 3 удара спрайта об стенку экрана, программа прерывается. Вроде заканчивается память. Подскажите как это...

Освобождение памяти - PHP
Приветствую. Дублирую эту тему. Потому как полагал, что проблема может быть связана с фраимворком. Проблема: есть скрипт, в...

Освобождение памяти - C++ Builder
//--------------------------------------------------------------------------- #ifndef Lariphm_H #define Lariphm_H /* *...

Qt освобождение памяти - C++ Qt
Раньше не когда не писал программ с графическим интерфейсом. Решил попробовать начать с Qt. Собственно возникли некоторые вопросы. ...

Освобождение памяти - C#
Подскажите, пожалуйста, я ещё зелёный в C#. Есть у меня класс Form1, при определённом событии в нём я создаю екземпляр класса Sposob и...

Освобождение памяти - Assembler
Задача - с использованием ассемблерных вставок в С++ написать транспонирование матрицы. Проблема - падает функция освобождения памяти....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.11.2012, 10:56     Освобождение памяти #2
1. Вообще ничего сказать нельзя, так как что делает метод add: - Загадка.
2. Да, не выделяйте конечно, можно. В программировании вообще все можно.
3. Ну как сказать то, они "типа указывают".

P.S. Граждане, это абзац. Не понимаете С, указатели и память? Читайте книжки, уважаемый, здесь Вам такое, как мне кажется никто не станет объяснять. Либо пройдите в отсек форума, где обсуждают "С для новичков".
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
05.11.2012, 13:08  [ТС]     Освобождение памяти #3
Метод add для сложения двух дробей
Objective-C
1
2
3
4
5
6
7
8
9
-(fraction *) add: (fraction *) f
{
Fraction *result = [[Fraction alloc]init]
int resultNum, resultDenom;
resultNum=numerator * f.denominator + denominator * f.numerator; //числитель и знаменатель здесь
resultDenom = denominator * f.denominator;
[result setTo: resultNum over: resultDenom];//представление в виде дроби
return result;
}
На счёт указателей. Ведь можно везде вместо указателя использовать адресса н а переменную, т.е &x например. Вот я и не пойму для чего укзатели - просто для упращения написания кода? Или это сделано для возможности управления памятью? Т.е если мне не нужно заботиться о памяти, то вполне можно обойтись ссылками?
Santer.Net
15 / 15 / 1
Регистрация: 18.11.2010
Сообщений: 122
12.11.2012, 02:03     Освобождение памяти #4
С точки зрения управления памятью здесь уже ошибка


-(fraction *) add: (fraction *) f
{
Fraction *result = [[Fraction alloc]init]
int resultNum, resultDenom;
resultNum=numerator * f.denominator + denominator * f.numerator; //числитель и знаменатель здесь
resultDenom = denominator * f.denominator;
[result setTo: resultNum over: resultDenom];//представление в виде дроби
return result;
}

Поскольку за освобождения памяти ответственен тот, кто создал объект. Должно было быть сделано так
Fraction *result = [[[Fraction alloc]init] autorelease]
В качестве аргументации:
1) Если проверить на лики в ИксКоде, то это место подсветиться
2) http://developer.apple.com/library/m...emoryMgmt.html
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
12.11.2012, 05:13     Освобождение памяти #5
Цитата Сообщение от Fooly Посмотреть сообщение
На счёт указателей. Ведь можно везде вместо указателя использовать адресса н а переменную, т.е &x например. Вот я и не пойму для чего укзатели - просто для упращения написания кода? Или это сделано для возможности управления памятью? Т.е если мне не нужно заботиться о памяти, то вполне можно обойтись ссылками?
нууу тут вам уже объяснили куда идти за такими азами
http://www.cyberforum.ru/c-beginners/
http://www.cyberforum.ru/cpp-beginners/

что значит использовать адреса вместо указателя? Это бред полный.
Подумайте, что вы говорите в контексте реальной жизни: вы говорите что можно жить не в доме по адресу, а в самом адресе.
вам в любом случае понадобится указатель, чтобы получить значение перемнной по адресу
C
1
2
3
4
5
6
7
8
9
int x = 1, y = 2;
int *p;
 
// либо так:
p = &x;
y = *p;
 
// либо так:
y = *&x;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 09:33     Освобождение памяти
Еще ссылки по теме:

Освобождение памяти - C#
Есть форма, из которой вызывается дочерняя форма, на дочерней форме есть пикчербокс, так вот, при вызове из главной в этот пикчербокс...

Освобождение памяти - C++ Qt
Добрый день Хочу спросить по поводу освобождения памяти. У меня есть головное окно которое вызывает диалоговое. С головного...

Освобождение памяти - C++/CLI
Доброго времени суток. Умные люди подкажите, плз. Как в c++ cli освободить память. Уже несколько дней бьюсь над проблемой. Опертор delete в...

Освобождение памяти - Программирование Android
Есть игра, в которой много уровней. Создание уровня происходит внутри оператора switch Вот пример одного из уровней. case 1: ...

Освобождение памяти со структурой - C++
Всем привет. Есть структура: struct ClientInfo { const char* szUid; const char* szName; const char* szSurname;

Правильное освобождение памяти - C++
Есть код class Test { public: int **container; int counter = 0; Test(unsigned int size) { container = new int*;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.11.2012, 09:33     Освобождение памяти #6
Цитата Сообщение от Vorona Посмотреть сообщение
C
1
2
3
4
5
6
7
int x = 1, y = 2;
int *p;
// либо так:
p = &x;
y = *p;
// либо так:
y = *&x;
Зря Вы так, только человека запутаете, имхо
Yandex
Объявления
12.11.2012, 09:33     Освобождение памяти
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru