Выпуск Базовых ссылок на объект Основы

Вы можете сделать это, используя Регулярные выражения , и это выглядит так

const str = '/item create name:"Test Item" price:0 stock:infinite';
const rgx = /\w+:(\".+\"|\w+)/g;
const matches = str.match(rgx);

console.log(matches);

20
задан Chris Hanson 17 May 2009 в 00:59
поделиться

4 ответа

Да, в CoreFoundation вы должны освободить что-либо, указав в имени Create или Copy. Вы делаете это с помощью CFRelease (). В вашем случае вы должны освободить и массив, и ссылки на адресную книгу.

26
ответ дан 29 November 2019 в 22:50
поделиться

] правила для управления памятью в Core Foundation аналогичны правилам в Cocoa: если метод, возвращающий ссылку, содержит слова «создать» или «копировать», вы владеете ссылкой и должны вызывать CFRelease () по этой ссылке на отказ от права собственности. В противном случае вы не являетесь владельцем ссылки и должны позвонить CFRetain , чтобы стать владельцем (обязательно потребуется последующее CFRelease , чтобы отказаться от этого нового владения). Эти правила, взятые из Руководства по программированию управления памятью для Core Foundation:

  • Если вы создаете объект (либо напрямую или сделав копию другой объект - см. «Создание Правило »), оно принадлежит вам.
  • Если вы получите объект откуда-то еще, вы делаете не владеть им. Если вы хотите предотвратить это будучи утилизированным, вы должны добавить себя как владельца (используя CFRetain).
  • Если вы являетесь владельцем объект, вы должны отказаться от владения когда вы закончите использовать это (с использованием CFRelease).

В вашем примере должны быть освобождены и адресная книга , и peopleArray . Поскольку в Core Foundation нет эквивалента автозапуска , если вы возвращаете ссылку из метода, верните массив без его освобождения . Вы должны (если только вы не злой) затем включить «create» в имя метода, чтобы указать вызывающей стороне, что теперь у них есть ссылка на возвращаемый объект. В этом случае CFArray бесплатно соединяется с NSCFArray , объектом Objective-C, который наследуется от NSObject . Таким образом, вы можете преобразовать peopleArray в NSArray * и autorelease , которые, если вам нужно вернуть его из функции / метода:

return [(NSArray*)peopleArray autorelease];

Обратите внимание, что это работает только для классов с бесплатными мостами. Насколько я понимаю, довольно сложно создать свои собственные классы с бесплатными мостами, и только примитивные (строка, массив и т. Д.) Классы CF являются бесплатными по мосту, поэтому этот подход не будет работать всегда. Наконец, если вы можете избежать использования автозапуска (т.е. вы можете сделать управление памятью более явным), это, вероятно, всегда хорошо.

26
ответ дан 29 November 2019 в 22:50
поделиться

Еще один небольшой момент, о котором еще никто не упомянул: некоторые классы CF имеют «бесплатный мост» с их аналогом NS. CFString и NSString , CFArray и NSArray являются примерами. Это актуально, так как вы можете просто использовать выпуск с этими классами.

См. Этот другой вопрос StackOverflow для получения дополнительной информации.

4
ответ дан 29 November 2019 в 22:50
поделиться

Я бы посоветовал прочитать руководство Apple по управлению памятью Core Foundation для более подробного обсуждения этого. У них есть аналогичное руководство для общего управления памятью Какао.

Чтобы освободить объект CF, вы должны вызвать функцию CFRelease .

3
ответ дан 29 November 2019 в 22:50
поделиться