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

Есть ли здесь утечка памяти? - Программирование iOS

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование iOS Не происходит переход на следующий ListViewController по первому касанию http://www.cyberforum.ru/ios-dev/thread917911.html
Есть два класса - ClassViewController и CategoryViewController. Первый отображает список классов, а второй - категории для каждого класса. Чтобы знать, какой класс был нажат - в...
Программирование iOS Использование XMPPFramework Собственно сабж. Возможно ли использовать в комерческих программах? И какие подводные камни? На закуску киньте тутотиалов. Нашёл только... http://www.cyberforum.ru/ios-dev/thread917710.html
Программирование iOS Регистрация А.Р. apple и Objective-C
Всем привет ребят, помогите пожалуйста с регистрацией аккаунта разработчика apple, я прошла регистрацию, но через 2 дня мне прислали на email, что неправильно ввела данные карты, потом снова...
Создание приложения! IOS Программирование iOS
Приложение. Функции : Ознакомление с ВУЗом База преподавателей с их. Непосредственными должностными функциями. Для, того чтоб перваки знали к кому идти. Списки мероприятий с описанием и точками...
Программирование iOS Timer http://www.cyberforum.ru/ios-dev/thread914017.html
Нужно чтобы в течение N секунд считывался и анализировался буффер. Но только N сек. Я так понимаю, что нужно использовать NSTimer. Не дадите ссылку или же привидите пример как это будет правильнее...
Программирование iOS 2D editor for UML Доброго времени суток, как вы уже поняли, имеется нужда написать 2D editor for UML. Я поковырялся в гугле и поискал frameworks которые могли бы подойти на эту ролью, но информации и времени было... подробнее

Показать сообщение отдельно
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
07.07.2013, 12:26
дополнительно на рассмотрение

1) код без утечек

Objective-C
1
2
3
4
5
6
7
8
9
10
    NSMutableString* s1 = [NSMutableString stringWithFormat:@"Hello"];
 
    for (int i = 0; i<100000; i++) {
        if (i<10) {
            NSLog(@"%@",s1);
        }
        [s1 appendString:@"Hello world"];
    }
    
    NSLog(@"count is %d ",[s1 retainCount]);
2) код с утечками

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
    NSMutableString* s1 = [NSMutableString new];
    
    
    
    for (int i = 0; i<100000; i++) {
        if (i<10) {
            NSLog(@"%@",s1);
        }
        [s1 appendString:@"Hello world"];
    }
    
    NSLog(@"count is %d ",[s1 retainCount]);
в обоих случаях счетчик показывает 1, => они должны утекать в обоих случаях, однако течет только в 2

идем дальше
3)

Objective-C
1
2
3
4
5
6
7
8
9
10
    NSMutableString* s1 = [[NSMutableString new] autorelease];
 
    for (int i = 0; i<100000; i++) {
        if (i<10) {
            NSLog(@"%@",s1);
        }
        [s1 appendString:@"Hello world"];
    }
    
    NSLog(@"count is %d ",[s1 retainCount]);
не течет, чтото мне подсказывает что в методе NSMutableString stringWithFormat уже по-умолчанию стоит autorelease

теперь проверим как ведет себя autorelease при принудительном уменьшении ссылки

4)

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
    NSMutableString* s1 = [[NSMutableString new] autorelease];
 
    for (int i = 0; i<100000; i++) {
        if (i<10) {
            NSLog(@"%@",s1);
        }
        [s1 appendString:@"Hello world"];
    }
    
    NSLog(@"count is %d ",[s1 retainCount]);
    
    [s1 release]; // << уменьшение ссылки
не получилось EXC_BAD_ACCESS

проверим как ведет себя "скрытый autorelease" в методе stringWithFormat, ведь мы не ожидаем что там он там прописан

5)

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
   NSMutableString* s1 = [NSMutableString stringWithFormat:@"Hello world"];
 
    for (int i = 0; i<100000; i++) {
        if (i<10) {
            NSLog(@"%@",s1);
        }
        [s1 appendString:@"Hello world"];
    }
    
    NSLog(@"count is %d ",[s1 retainCount]);
    
    [s1 release]; // << уменьшение ссылки
получилось

однако появилась странная надпись

test_ARC(690,0xac1cda28) malloc: *** error for object 0x753ad90: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
что как бы означает что релизить нельзя

чтобы разобраться в сабже идем в гугл и видим там

http://stackoverflow.com/questions/5...ringwithformat
You never release it. It's autoreleased already.

You only ever release objects which were given to you via methods whose names begin with +alloc, +new -copy, -mutableCopy, or -retain. If the name begins with anything else, you don't own it and are not responsible for releasing it.
что дословно означает: Если вы используете в конструкторе +alloc, +new -copy, -mutableCopy, or -retain тогда требуется релизить

------

Из этого можно сделать вывод, что без использования ARC, нужно во всех ваших классах писать конструкторы со словом init

например:

initWithData
initWithObject и прочее чтобы было видно что autorelease не используется.

---

я так гуглу походил, внятного ответа как распознать autorelease объект там нет.
=> только тестированием и использованием статических методов названием с init и прочими, которые указывали что autorelease не используется
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru