Что такое модификатор памяти weak ?
Спросят с вероятностью 27%
Модификатор памяти weak используется для предотвращения так называемых "сильных ссылочных циклов" (strong reference cycles) между экземплярами классов. Возникают, когда два объекта взаимно ссылаются друг на друга сильными ссылками, что препятствует автоматическому подсчёту ссылок (Automatic Reference Counting, ARC) корректно управлять памятью и освобождать эти объекты.
Как он работает
Создаёт "слабую ссылку" на объект, в отличие от обычной "сильной ссылки". Удерживают объект в памяти, пока на него существует хотя бы одна такая ссылка. В отличие от них, слабые ссылки не увеличивают счётчик ссылок объекта, к которому они относятся. Это означает, что объект может быть освобождён из памяти, даже если на него существуют слабые ссылки.
В этом примере, если бы
Зачем его использовать
Использование рекомендуется в случаях, когда вы хотите избежать владения одним объектом другим в такой степени, что это мешает освобождению памяти. Это часто встречается в отношениях "один ко многим", где один объект может иметь ссылки на многих дочерних, но дочерние объекты не должны "владеть" родителем.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
  Спросят с вероятностью 27%
Модификатор памяти weak используется для предотвращения так называемых "сильных ссылочных циклов" (strong reference cycles) между экземплярами классов. Возникают, когда два объекта взаимно ссылаются друг на друга сильными ссылками, что препятствует автоматическому подсчёту ссылок (Automatic Reference Counting, ARC) корректно управлять памятью и освобождать эти объекты.
Как он работает
Создаёт "слабую ссылку" на объект, в отличие от обычной "сильной ссылки". Удерживают объект в памяти, пока на него существует хотя бы одна такая ссылка. В отличие от них, слабые ссылки не увеличивают счётчик ссылок объекта, к которому они относятся. Это означает, что объект может быть освобождён из памяти, даже если на него существуют слабые ссылки.
class Person {
    var name: String
    var pet: Pet?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}
class Pet {
    var name: String
    weak var owner: Person?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}
var john: Person? = Person(name: "John")
var dog: Pet? = Pet(name: "Fido")
john?.pet = dog
dog?.owner = john
john = nil
dog = nilВ этом примере, если бы
owner в классе Pet был сильной ссылкой, установка john = nil и dog = nil не привела бы к освобождению памяти, занимаемой этими объектами, потому что они бы продолжали ссылаться друг на друга. Однако, поскольку owner является слабой ссылкой, освобождение john не мешает автоматическому освобождению dog.Зачем его использовать
Использование рекомендуется в случаях, когда вы хотите избежать владения одним объектом другим в такой степени, что это мешает освобождению памяти. Это часто встречается в отношениях "один ко многим", где один объект может иметь ссылки на многих дочерних, но дочерние объекты не должны "владеть" родителем.
weak используется для создания слабых ссылок на объекты, чтобы помочь избежать проблем с управлением памятью, которые могут возникнуть из-за сильных ссылочных циклов. Это как если бы вы держали в руках шарик на ниточке, но так, чтобы он мог легко высвободиться и улететь, когда это будет нужно, не заставляя вас его держать.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
    75%
    Observer
      
    20%
    Delegate
      
    3%
    Singleton
      
    1%
    Factory
      
    👀1
  Как проходит жизненный цикл vue контроллера ?
Спросят с вероятностью 18%
Жизненный цикл во Vue.js описывает различные стадии от создания до уничтожения компонента. Можно использовать "хуки" жизненного цикла для выполнения кода в определённые моменты:
1️⃣beforeCreate
✅Этот хук вызывается сразу после инициализации экземпляра, до инициализации реактивных данных и событийных слушателей.
2️⃣created
✅На этом этапе экземпляр полностью создан, установлены реактивные данные и настроены событийные слушатели, но компонент ещё не монтируется в DOM.
3️⃣beforeMount
✅Вызывается непосредственно перед тем, как компонент монтируется в DOM. В этот момент можно получить доступ к шаблону и виртуальному DOM, но ещё не к реальному DOM.
4️⃣mounted
✅Этот хук вызывается после того, как компонент был вставлен в DOM. Здесь можно выполнять действия, которые требуют взаимодействия с DOM (например, через
5️⃣beforeUpdate
✅Вызывается после изменения данных, которые приводят к необходимости обновления DOM, но перед самим обновлением. Это хорошее место для доступа к существующему DOM перед его ре-рендерингом.
6️⃣updated
✅Вызывается после обновления DOM в результате изменения данных. Используется для выполнения кода, зависимого от актуализированного DOM.
7️⃣beforeDestroy
✅Этот хук вызывается перед уничтожением экземпляра компонента. Здесь можно выполнить необходимую очистку, например, удалить событийные слушатели или отменить таймеры.
8️⃣destroyed
✅Вызывается после уничтожения экземпляра компонента, когда все директивы компонента разрешены, событийные слушатели удалены и реактивные связи разорваны.
Этот код демонстрирует, как можно использовать хуки жизненного цикла Vue.js для различных целей, связанных с его состоянием и интеракциями с DOM.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Жизненный цикл во Vue.js описывает различные стадии от создания до уничтожения компонента. Можно использовать "хуки" жизненного цикла для выполнения кода в определённые моменты:
1️⃣beforeCreate
✅Этот хук вызывается сразу после инициализации экземпляра, до инициализации реактивных данных и событийных слушателей.
2️⃣created
✅На этом этапе экземпляр полностью создан, установлены реактивные данные и настроены событийные слушатели, но компонент ещё не монтируется в DOM.
3️⃣beforeMount
✅Вызывается непосредственно перед тем, как компонент монтируется в DOM. В этот момент можно получить доступ к шаблону и виртуальному DOM, но ещё не к реальному DOM.
4️⃣mounted
✅Этот хук вызывается после того, как компонент был вставлен в DOM. Здесь можно выполнять действия, которые требуют взаимодействия с DOM (например, через
this.$el).5️⃣beforeUpdate
✅Вызывается после изменения данных, которые приводят к необходимости обновления DOM, но перед самим обновлением. Это хорошее место для доступа к существующему DOM перед его ре-рендерингом.
6️⃣updated
✅Вызывается после обновления DOM в результате изменения данных. Используется для выполнения кода, зависимого от актуализированного DOM.
7️⃣beforeDestroy
✅Этот хук вызывается перед уничтожением экземпляра компонента. Здесь можно выполнить необходимую очистку, например, удалить событийные слушатели или отменить таймеры.
8️⃣destroyed
✅Вызывается после уничтожения экземпляра компонента, когда все директивы компонента разрешены, событийные слушатели удалены и реактивные связи разорваны.
export default {
  name: 'MyComponent',
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  beforeCreate() {
    console.log('beforeCreate: Компонент еще не создан.');
  },
  created() {
    console.log('created: Компонент создан.');
  },
  beforeMount() {
    console.log('beforeMount: Компонент скоро будет монтирован в DOM.');
  },
  mounted() {
    console.log('mounted: Компонент монтирован в DOM.');
  },
  beforeUpdate() {
    console.log('beforeUpdate: Компонент скоро будет обновлен.');
  },
  updated() {
    console.log('updated: Компонент обновлен.');
  },
  beforeDestroy() {
    console.log('beforeDestroy: Компонент ск
оро будет уничтожен.');
  },
  destroyed() {
    console.log('destroyed: Компонент уничтожен.');
  }
}Этот код демонстрирует, как можно использовать хуки жизненного цикла Vue.js для различных целей, связанных с его состоянием и интеракциями с DOM.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🤯10🤔5😁3
  Anonymous Quiz
    53%
    protocol class
      
    10%
    class only
      
    33%
    class
      
    4%
    typealias
      
    Какие бывают модификаторы доступа ?
Спросят с вероятностью 27%
Модификаторы доступа используются для инкапсуляции данных и функциональности в классах, структурах и других типах, позволяя контролировать, как и где можно получать доступ к членам типа (например, свойствам, методам, инициализаторам). Это ключевая часть архитектуры ПО, поскольку правильно настроенный контроль доступа может предотвратить несанкционированное изменение состояния объекта и улучшить модульность кода.
Есть несколько уровней доступа:
1️⃣Open и Public:
✅
✅
   
2️⃣Internal:
✅
3️⃣File-private:
✅
4️⃣Private:
✅
Зачем они нужны?
Помогают обеспечивать безопасность и чистоту архитектуры приложения, позволяя разработчикам точно контролировать, какие части кода могут использовать другие части кода. Это особенно важно в больших проектах и при создании библиотек, где необходимо чётко разграничивать внутреннюю логику и публичный интерфейс модулей.
Модификаторы доступа — это правила, которые определяют, кто и где может использовать части вашего кода. Они помогают делать код безопасным и организованным, как закрытые и открытые секции в библиотеке: некоторые доступны всем, а другие — только избранным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
  Спросят с вероятностью 27%
Модификаторы доступа используются для инкапсуляции данных и функциональности в классах, структурах и других типах, позволяя контролировать, как и где можно получать доступ к членам типа (например, свойствам, методам, инициализаторам). Это ключевая часть архитектуры ПО, поскольку правильно настроенный контроль доступа может предотвратить несанкционированное изменение состояния объекта и улучшить модульность кода.
Есть несколько уровней доступа:
1️⃣Open и Public:
✅
open позволяет элементам быть доступными и наследуемыми вне определяющего их модуля (например, библиотеки или фреймворка). open также позволяет переопределять методы в расширяющих модулях.✅
public делает элементы доступными вне модуля, но не позволяет их наследование или переопределение вне модуля.2️⃣Internal:
✅
internal делает элементы доступными в пределах того же модуля. Это уровень доступа по умолчанию в Swift, если явно не указан другой модификатор.3️⃣File-private:
✅
fileprivate ограничивает доступ к элементу в пределах того файла исходного кода, в котором он объявлен.4️⃣Private:
✅
private строго ограничивает область видимости элемента рамками его объявления. То есть private элемент доступен только внутри того контекста (например, класса или структуры), где он был объявлен, и в расширениях этого класса или структуры в том же файле.open class OpenClass {
    open var openVariable: Int = 1
    public var publicVariable: Int = 2
    internal var internalVariable: Int = 3
    fileprivate var fileprivateVariable: Int = 4
    private var privateVariable: Int = 5
}
public class PublicClass {
    // Этот класс не может быть наследован за пределами этого модуля
}
internal class InternalClass {
    // Доступен только внутри того же модуля
}
fileprivate class FilePrivateClass {
    // Доступен только внутри этого файла
}
private class PrivateClass {
    // Доступен только внутри других объявлений в этом же файле
}
Зачем они нужны?
Помогают обеспечивать безопасность и чистоту архитектуры приложения, позволяя разработчикам точно контролировать, какие части кода могут использовать другие части кода. Это особенно важно в больших проектах и при создании библиотек, где необходимо чётко разграничивать внутреннюю логику и публичный интерфейс модулей.
Модификаторы доступа — это правила, которые определяют, кто и где может использовать части вашего кода. Они помогают делать код безопасным и организованным, как закрытые и открытые секции в библиотеке: некоторые доступны всем, а другие — только избранным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
    13%
    iterate(over:)
      
    3%
    generate()
      
    59%
    lazy()
      
    25%
    sequence(first:next:)
      
    Оптимизация "copy on write" (COW) представляет собой стратеги оптимизации управления памятью, применяемую к коллекциям и другим структурам данных, которые ведут себя как типы значений (value types), такие как структуры и перечисления. Эта стратегия позволяет избежать ненужного копирования объектов до тех пор, пока не произойдет попытка изменения.
Когда вы работаете с типами значений, такими как массивы или словари, и присваиваете их новой переменной или константе, по умолчанию они копируются. В большинстве случаев это поведение эффективно и безопасно, поскольку гарантирует, что изменения в одном месте не повлияют на другое. Однако, если эти структуры данных велики, копирование может быть ресурсоемкой операцией.
Чтобы оптимизировать производительность, используется техника "copy on write". Суть её в том, что фактическое копирование происходит только в момент изменения данных. Если вы просто передаете данные или работаете с ними в режиме только для чтения, копирование не производится. Это значительно снижает нагрузку на память и процессор, особенно при работе с большими объемами данных.
var original = [1, 2, 3]
var copy = original // Здесь копирование не происходит, обе переменные ссылаются на один и тот же участок памяти
copy.append(4) // Только сейчас происходит фактическое копирование, так как мы модифицируем `copy`
В этом примере, когда мы добавляем элемент в
copy, он определяет, что массив должен быть изменен, и только тогда происходит реальное копирование. До момента модификации original и copy эффективно ссылаются на одни и те же данные, что экономит ресурсы.Суть оптимизации "copy on write" заключается в минимизации издержек на копирование данных, проводя копирование только тогда, когда это действительно необходимо для изменения данных. Это улучшает производительность при работе с большими структурами данных, сохраняя при этом безопасность и простоту работы с типами значений.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤2😁2
  Anonymous Quiz
    38%
    func getFirstString(strings: [String]) -> String { return strings.first }
      
    7%
    function getFirstString([String]) -> String { return strings[0] }
      
    10%
    func getFirstString(strings: Array<String>) -> String { return strings.first }
      
    45%
    func getFirstString(strings: [String]) -> String { return strings[0] }
      
    😁2🤯1
  SOLID — это аббревиатура, обозначающая пять основных принципов объектно-ориентированного программирования и дизайна, которые помогают разработчикам создавать системы, легкие в поддержке и расширении. Эти принципы были сформулированы Робертом Мартином (Uncle Bob) и являются ключевыми в построении эффективных, масштабируемых и поддерживаемых программных систем. Вот они:
SOLID помогает создавать более гибкие, устойчивые к изменениям и легкие в поддержке системы. Применение этих принципов способствует созданию кода, который легче понимать, расширять и поддерживать.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Anonymous Quiz
    27%
    Методика для прерывания выполнения функции, если значение `nil`
      
    25%
    Способ вызова свойства, метода или субскрипта на `nil` без вызова ошибки
      
    45%
    Последовательность условных операторов для проверки `nil`
      
    3%
    Техника для уменьшения использования памяти при работе с переменными
      
    Когда работаешь с замыканиями или опциональными типами, часто встречаешься с понятиями "weak" и "unowned". Оба этих ключевых слова используются для предотвращения утечек памяти в случае циклических ссылок, но между ними есть важные различия.
nil, когда объект, на который она указывает, уничтожается. Это полезно, когда объект может быть уничтожен в любой момент, и вы хотите избежать висячих указателей.class ExampleClass {
    var property: AnotherClass?
}
class AnotherClass {
    weak var backReference: ExampleClass?
}class ExampleClass {
    var property: AnotherClass?
}
class AnotherClass {
    unowned var backReference: ExampleClass
}Главное различие заключается в том, что "weak" ссылки всегда являются опциональными и автоматически становятся
nil, когда объект удаляется, предотвращая висячие указатели. "Unowned" ссылки предполагают, что другой объект будет жить столько же или дольше, и поэтому они не являются опциональными и не обнуляются.Важно понимать эти различия, чтобы избежать ошибок времени выполнения, особенно при работе с несильными ссылками, так как обращение к уже освобожденному объекту через несильную ссылку приведет к крашу программы.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤1👍1
  Anonymous Quiz
    47%
    sort()
      
    49%
    sorted()
      
    3%
    order()
      
    0%
    arrange()
      
    🤔3
  Ассоциированный тип — это особенность протоколов, позволяющая определить плейсхолдер для типа, который будет уточнён только тогда, когда протокол будет принят каким-либо типом. Это предоставляет дополнительный уровень гибкости в определении и использовании протоколов, позволяя создавать обобщённые протоколы, которые могут быть адаптированы для работы с любыми типами.
С помощью ассоциированных типов протоколы могут быть написаны таким образом, чтобы они были не конкретно привязаны к какому-либо типу. Это делает протоколы очень мощным инструментом для создания гибких и повторно используемых компонентов.
protocol Container {
    associatedtype Item // Определение ассоциированного типа
    
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
    // конкретная реализация ассоциированного типа Item как Int
    typealias Item = Int
    // реализация требований протокола
    var items = [Item]()
    mutating func append(_ item: Item) {
        items.append(item)
    }
    var count: Int {
        return items.count
    }
    subscript(i: Int) -> Item {
        return items[i]
    }
}В этом примере, протокол
Container определяет требования для контейнерных типов, включая ассоциированный тип Item. Когда структура IntStack принимает протокол Container, она указывает, что ассоциированный тип Item будет представлен как Int. Это позволяет протоколу Container быть адаптивным и работать с любыми типами, сохраняя при этом строгую типизацию и безопасность типов, характерные для Swift.Ассоциированные типы особенно полезны в контексте обобщённого программирования, где один и тот же протокол может быть использован для определения функциональности, применимой к широкому спектру типов, без привязки к конкретным типам данных в самом протоколе.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤2
  Anonymous Quiz
    73%
    ["key1": "value1", "key2": "value2"]
      
    17%
    Dictionary("key1": "value1", "key2": "value2")
      
    4%
    {["key1": "value1", "key2": "value2"]}
      
    5%
    (key1: "value1", key2: "value2")
      
    В ООП существует множество паттернов, которые помогают решать различные задачи проектирования и разработки ПО. Паттерны проектирования представляют собой проверенные решения типовых проблем, с которыми сталкиваются разработчики. Они способствуют написанию более чистого, понятного и масштабируемого кода. Основные категории паттернов включают в себя порождающие, структурные и поведенческие паттерны.
Порождающие паттерны
Эти паттерны связаны с процессами создания объектов, делая систему независимой от способа создания, компоновки и представления объектов.
Структурные паттерны описывают, как объединять объекты и классы в более крупные структуры.
Поведенческие паттерны регулируют эффективное взаимодействие и распределение обязанностей между объектами.
Эти паттерны не только помогают решать типичные задачи проектирования, но и способствуют созданию более читаемого, удобного для поддержки и масштабируемого кода.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤1
  Anonymous Quiz
    5%
    `?`
      
    94%
    `!`
      
    0%
    `*`
      
    0%
    `&`
      
    Механизм Copy-on-Write (CoW) используется для оптимизации производительности и использования памяти при копировании объектов. Этот механизм особенно полезен для неизменяемых (immutable) структур данных. CoW часто ассоциируется со стандартными коллекциями и собственными типами данных, реализованными как структуры (value types), такие как
Array, String, Dictionary, и Set.Работает так, что копия объекта создаётся только в тот момент, когда происходит попытка модификации. До этого момента все копии объекта фактически ссылаются на одни и те же данные в памяти. Это позволяет сэкономить как время, так и память, поскольку избегается ненужное дублирование данных, когда оно не требуется.
Автоматически применяет механизм CoW к своим стандартным коллекциям, таким как
Array, String, Dictionary, и Set. Это означает, что при передаче этих объектов в функции или при их копировании реальное дублирование данных происходит только в случае модификации одной из копий. Таким образом, если вы создаёте копию массива и не изменяете его, обе переменные будут указывать на одни и те же данные в памяти. Как только вы модифицируете одну из копий, Swift создаст реальную копию данных для этой копии, обеспечивая независимость данных между оригиналом и копией.var originalArray = [1, 2, 3]
var copiedArray = originalArray // На этом этапе данные не дублируются
copiedArray.append(4) // Теперь данные копируются, потому что copiedArray модифицируется
В этом примере до вызова
append обе переменные, originalArray и copiedArray, ссылаются на один и тот же набор данных. Модификация copiedArray активирует механизм CoW, и Swift создаёт реальную копию данных для copiedArray.Можно реализовать для своих собственных типов данных. Это может быть полезно для эффективного управления памятью и повышения производительности при работе с большими или сложными структурами данных. Для реализации CoW в своих типах необходимо вручную проверять, является ли экземпляр типа уникальной ссылкой, и копировать данные при необходимости, обычно используя методы для работы с памятью, такие как
isKnownUniquelyReferenced().Copy-on-Write — это механизм оптимизации, который позволяет отложить копирование данных до момента их реальной модификации. Это улучшает производительность и эффективность использования памяти, особенно при работе с большими структурами данных. Swift автоматически применяет CoW к своим стандартным коллекциям, таким как
Array, String, Dictionary,и Set.Please open Telegram to view this post
    VIEW IN TELEGRAM
  Anonymous Quiz
    74%
    enum Name: String { case A = "Apple", B = "Banana" }
      
    16%
    enum Name { case A = "Apple", case B = "Banana" }
      
    4%
    enum Name(String) { case A = "Apple", case B = "Banana" }
      
    5%
    type enum Name: String { case A = "Apple", case B = "Banana" }
      
    MVVM (Model-View-ViewModel) — это архитектурный паттерн, разработанный для упрощения создания пользовательского интерфейса, который был впервые представлен Microsoft для использования с Windows Presentation Foundation (WPF) и Silverlight. С тех пор он нашёл широкое применение в различных технологиях разработки программного обеспечения, включая разработку под iOS и Android. MVVM помогает разделить логику представления интерфейса (UI) от бизнес-логики и логики приложения, упрощая тестирование и поддержку.
MVVM может быть реализован с использованием различных фреймворков и технологий, таких как RxSwift или Combine, которые предоставляют мощные инструменты для реализации привязки данных и управления потоками данных. Это позволяет разработчикам создавать реактивные приложения, где View автоматически обновляется в ответ на изменения данных, обеспечивая более плавный и интуитивно понятный пользовательский опыт.
MVVM не только способствует созданию более чистого и организованного кода, но и облегчает сотрудничество в командах, позволяя разработчикам интерфейса и логики приложения работать более независимо.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Anonymous Quiz
    2%
    protocol MyProtocol { mandatory func myMethod() }
      
    14%
    protocol MyProtocol { required func myMethod() }
      
    82%
    protocol MyProtocol { func myMethod() }
      
    1%
    define protocol MyProtocol { func myMethod() }
      
    