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

Objective-C

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

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

05.11.2012, 10:37. Просмотров 1094. Ответов 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     Освобождение памяти
Посмотрите здесь:

Освобождение памяти Delphi
C++ Builder Освобождение памяти
Освобождение памяти C#
резервирование памяти/освобождение памяти для трехмерного массива C++
с++ Освобождение памяти C++
Приложение вылетает, сообщая о нехватке памяти Objective-C
Objective-C Сколько максимум оперативной памяти желательно использовать приложению?
Получить объект по адресу в памяти Objective-C
Objective-C HTMLParser - ошибка памяти
C++ Qt Освобождение памяти
Objective-C Воспроизведение аудио из памяти используя AVAydioPlayer

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
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;
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     Освобождение памяти
Ответ Создать тему
Опции темы

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