Nano Hash - криптовалюты, майнинг, программирование

Проблема с утечкой памяти NSAutoreleaseNoPool()

Я пытаюсь создать неизменяемую строку. Я не инициализирую его с помощью init, alloc или new, но память все равно протекает, и он говорит: «Объект 0x234b533 класса NSCFString автоматически выпущен без пула на месте - просто утечка» вот что я пытаюсь сделать

NSMutableString *srn = [NSMutableString stringwithCString:devSID];

// devSID is *char

это оставляет утечку. Я тоже пробовал это

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];

но это тоже не работает, однако, если я попытаюсь инициализировать его простой строкой, подобной этой

NSMutableString *srn = @"this is my string";

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

С Уважением

Умайр


  • Вы не получаете предупреждение компилятора с последним? 30.11.2010

Ответы:


1

Попробуйте что-то вроде этого

[[NSString stringWithCString:"Hello"] сохранить];

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

Примечание. Если вы сохраняете этот объект, вам необходимо сбалансировать количество выпусков. Если вы не освободите сохраненный объект, вы столкнетесь с проблемой утечки памяти.

30.11.2010
  • всего одна строчка... и этот парень решил мою проблему... спасибо дружище 30.11.2010
  • Вам нужно будет сбалансировать этот retain с более поздним release, иначе у вас будет утечка памяти. 30.11.2010
  • @paul @Omayr На самом деле проблема в том, что он создал объект автовыпуска в выделенном пуле автовыпуска.. вот почему я предложил ему сохранить этот объект.. теперь он должен выпустить этот объект, как только он закончит с функциональной частью 01.12.2010
  • Этот ответ неверен, потому что он не решает фундаментальную проблему и приведет к утечке памяти. Как утверждает Ной, пул автоматического выпуска должен быть на месте, иначе произойдет утечка любых автоматически выпущенных объектов. 12.12.2010
  • @Brad: Я думаю, что я тот, кто разместил вопрос, и моя проблема теперь решена, и ответ Тарака - идеальное решение моей проблемы. Неправильный ответ более полезен, если он может решить проблему в реальном времени, чем правильный ответ, который не может. Другой ответ получил 5 голосов, но он бесполезен для меня, поэтому для меня он совершенно бесполезен, потому что человек не обратил особого внимания на вопрос и просто записал любимый ответ. Итак, Брэд, пожалуйста, верните этот ответ голосами, которых он заслуживает. 13.12.2010
  • Просто комментарий, что то, что что-то работает, не означает, что это правильный ответ. Выяснение того, почему ваше приложение дает сбой, и поиск правильного решения для вашего сбоя — правильное решение. Это все равно, что наклеить изоленту на самолет. 13.12.2010
  • @Omayr - в вашем вопросе есть только одна причина появления сообщения об ошибке - отсутствие NSAutoreleasePool. Следовательно, ответ Ноя является правильным для заданного вопроса. Да, вам нужно сохранить (и позже выпустить) автоматически выпущенный объект, созданный в пуле, если вы хотите использовать его за пределами этого пула, но это не было частью вашего вопроса. Ответ Тарика в лучшем случае неполный и может быть вредным для разработчиков, которые только изучают управление памятью Objective-C. 13.12.2010
  • Я попробовал autoreleasepool, верьте мне или нет, и я думаю, что вы не будете. Но все же он протекал, хотя я не использовал инициализацию или новые вещи. Проблема заключалась в том, что NSString был выпущен, как только он был инициализирован, даже до того, как выпуск AutoReleasePool действительно вступит в силу. У тебя нет никаких проблем, но у Тарика они были. Поэтому это было проблемно-ориентированное решение. И технически его ответ его правильный. Я сделал то же самое, упомянул об этом другой ответ, но память все еще просачивалась. Теперь решите, стоило ли ваше вмешательство того или нет. 13.12.2010

  • 2

    Утечка вызвана тем, что вы автоматически выпускаете объект, не имея пула автоматического выпуска, чтобы позаботиться о нем. Обычно это происходит, когда вы делаете что-то помимо основного потока, создавая свои собственные потоки или просто используя метод удобства -performSelectorInBackground:withObject:. Если вы хотите использовать функцию автоматического выпуска (подразумеваемую здесь использованием метода класса NSMutableString), вам необходимо создать пул автоматического выпуска в начале блока кода, где вы будете его использовать, и слить его в конце. Другими словами, что-то в этом роде:

    - (void)myBackgroundThing:(id)whatever
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        NSMutableString *srn = [NSMutableString stringwithCString:devSID];
    
        // etc...
    
        [pool release];
    }
    
    30.11.2010
  • Даже если кто-то не хочет использовать функцию автоматического освобождения, многие объекты Cocoa все равно будут делать это за кулисами, поэтому почти всегда хорошей идеей является создание пула для фоновых потоков. 30.11.2010
  • На самом деле, в среде с подсчетом ссылок вы должны всегда создавать пул автоматического освобождения для каждого потока, который будет использовать Cocoa. Если вы пишете автономный инструмент командной строки, вам также следует создать пул autoerelease в main(). 30.11.2010
  • Есть две вещи, на которые я хотел бы обратить внимание: 1) я уже пробовал это, но приложение вылетает, как только оно вставляет этот блок autoreleasepool и выпускает. 2) Зачем мне нужен autoreleasepool, если я не использую init с NSMutableString 30.11.2010
  • Вы используете метод NSMutableString, который возвращает автоматически выпущенный объект. Поэтому вам нужен пул авторелиза. Что касается сбоя вашего приложения, когда вы добавляете это, нам нужно увидеть больше кода. 30.11.2010
  • @Omayr - причина, по которой это вызывает сбой, вероятно, заключается в том, что вы создаете автоматически выпущенный объект в пределах области действия пула, а затем пытаетесь получить к нему доступ намного позже, после того, как пул был опорожнен. Хотя решение Tariq, заключающееся в простом добавлении удержания, может предотвратить сбой, вы создаете утечку памяти, если не создаете пул автоматического освобождения, а также не освобождаете сохраненный объект после того, как закончите с ним. Здесь Ной предлагает правильное решение фундаментальной проблемы. 12.12.2010
  • @Brad, мне жаль, что вы не смогли понять мою проблему, и я не пытаюсь делать то, что вы сказали. И, используя решение Тарика, я дважды проверил свое приложение и не обнаружил ни одной утечки памяти. Как только я принял Тарика, это означает, что моя проблема решена, и нет смысла обсуждать ее снова и снова. 13.12.2010
  • Потому что другие люди прочитают это и реализуют решение, которое вы неправильно пометили как принятое. Таким образом, проблема будет продолжать преследовать разработчиков в будущем. Нам кажется, что это с кодированием копирования и вставки PHP. Проблемы, которые были решены много лет назад, остаются проблемой из-за этого типа кодирования. Брэд прав, комментируя и предоставляя информацию для будущих разработчиков, которые прочитают это. Потому и выложил. 13.12.2010
  • @Omayr - То, что вы не видите утечки памяти в инструменте Leaks, не означает, что ее нет. Утечки могут быть очень тонкими, поэтому разработчикам необходимо понимать лежащие в их основе правила управления памятью, а не просто retain что-то шлепать и заканчивать. Даже если решение Тарика сработало для вас в этом конкретном случае, подход Ноя верен почти во всех случаях, когда появляется сообщение об ошибке, о котором вы сообщаете. 13.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..