---
# System prepended metadata

title: Общие вопросы

---

# Общие вопросы

1. Какие бывают типы данных?
2. Чем отличаются классы и структуры?
3. Отличие Reference type от Value type?
4. Что такое Optional в Swift? Как его создать? Для чего используется?
5. Жизненный цикл приложения? (Not running, Inactive, Active, Background, Suspended)
6. Что такое замыкания и где их можно использовать? Какой у них тип?
7. Что такое захват переменных в замыкании? Как оно работает?
8. Что такое убегающие (escaping closures)?
9. Что такое делегат и как они работают в iOS?
10. Как работают push нотификации?
11. let vs var?
12. typealias? Создание своего собственного типа?
14. Что такое enum и для чего используются?
15. Что определяет ключевое слово final перед определением class?
16. Closure – Value или Reference Type?
17. Как разворачивается Optional?
18. Indirect enum что это?

##### didSet: didSet: [7] didSet: [7, 2] deinit
```
import UIKit

final class MyArray {
    var array: [Int] = [] {
        didSet {
            print("didSet: \(array)")
        }
    }
    
    init(_ array: [Int]) {
        self.array = array
    }
    
    deinit {
        print("deinit")
        array = [4]
    }
}

var array: MyArray? = MyArray([5])
array?.array = [7]
array?.array.append(2)
array = nil
```

##### 5 7 4
```
import UIKit

var array = [5,7,4]
for index in array {
    print("\(index)")
    array = [1,9,6]
}
```

##### Volvo BMW
````
import UIKit

struct Car {
    var name: String
}

var car1 = Car(name: "Volvo")
let car2 = car1
car1.name = "BMW"
print("\(car2.name)")
print("\(car1.name)")
````

##### Cannot assign to property: 'model2' is a 'let' constant 
```
import UIKit

enum ModelType {
    case unknown
    case quad
    case triangle
}

struct Model {
    var type: ModelType = .unknown
}

var model1 = Model()
model1.type = .quad

let model2 = Model()
model2.type = .triangle
```

# Память

1. Чем отличается ARC от MRC?
2. Как использовать self внутри блоков? Приведите пример retain cycle в блоке?
3. Как работает сборщик мусора в iOS?
4. Отличие weak от unowned?
5. Что такое Retain Cycle? Каким образом исправляется проблема Retain Cycle?
6. Чем отличается стек от кучи?


# UIKit

1. Чем отличается UIView от CALayer?
2. Чем отличаются bounds и frame? Меняется ли размер frame при повороте?
3. Когда bounds будет отлично от нуля?
4. Как работает UITableView?
5. Разница между points и pixels?
6. Что такое Autolayout и как он работает?
7. Жизненный цикл ViewController? (load view, viewDidLoad, viewWillAppear, viewWillLayoutSubviews, viewDidLayoutSubviews, viewDidAppear, viewWillDissapear, viewDidDissapear)
8. Что означают IBOutlet и IBAction, для чего они нужны, и что значат для препроцессора?
9. Что можно сделать если клавиатура при появлении скрывает важную часть интерфейса?
10. Что такое StotyBoard? В чем разница между xib и nib файлами?
11. Что такое UIStackView?
12. В чем разница CollectionViews & TableViews?
13. Расскажите о методе hitTest?
14. Как работает UIGestureRecognizer?

# Сети

1. Какие бывают протоколы передачи данных?
2. Что такое REST API? Как он работает?
3. Чем отличается HEAD, POST, GET, PUT, DELETE?
4. Отличие JSON от XML? Когда и где лучше использовать то или другое?
5. Что такое сокет? Чем отличается TCP от UDP?

# База данных и данные

1. Какие бд Вы знаете? (Realm, SQLIte, Core Data)
2. Какие типы хранилищ поддерживает CoreData? (XML, SQLite, In-Memory, Binary)
3. Что такое Keychain?
4. В каких случаях лучше использовать SQLite, а в каких Core Data?
5. Что такое коллизия хеш-функции?
6. Как работает Copy-on-Write? С какими типами данных работает данныпо умолчанию только с массивами и словарями
7. Что такое миграция базы данных?


# Многопоточность

1. Что такое поток и процесс? Чем отличаются?
2. Что такое GCD и NSOperation? Чем отличаются?
3. Когда лучше использовать GCD, а когда NSOperationQueue?
4. Что такое DeadLock?
5. Какие бывают очереди в Swift? Их отличие?
6. Что такое QoS (Quality of Service, уровень сервиса или обслуживания)? Какие бывают и где используются? (User Interactive, User Initiated, Utility, Background; Default — приоритет размещен между User Initiated и Utility)
7. Синхронность и асинхронность. Привести пример
8. Зачем использовать synchronized?
9. Что такое DispatchGroup?
10. Что такое Runloop и как они работают?
11. Как многопоточность работает с UIKit?
12. Можно ли отменить операцию на выполнении?

##### Негарантированно 200-202
```
import Foundation

var count = 0

let group = DispatchGroup()
group.enter()

DispatchQueue.global(qos: .default).async {
    for _ in 0...100 {
        count += 1
    }
    group.leave()
}

group.enter()
DispatchQueue.global(qos: .background).async {
    for _ in 0...100 {
        count += 1
    }
    group.leave()
}

group.wait()
print(count)
```


##### Deadlock
```
DispatchQueue.main.sync {
    print("Say hello")
}
```

##### 1 2 4 3
```
let block: (()->Void)? = {
    print("4")
}

DispatchQueue.global().sync {
    DispatchQueue.global().async {
        print("2")
    }
    
    print("1")
    
    DispatchQueue.global().async {
        print("3")
    }
}

block?()
```

##### 8 6 5 1 4 2 9
```
import Foundation

func callMe()
{
    print("6")
    DispatchQueue.global().async {
        print("1")
        DispatchQueue.main.sync {
            print("2")
        }
        print("9")
    }
    print("5")
}

print("8")
callMe()
print("4")
```

# Тестирование

1. Что такое Unit-тесты и как они работают?
2. Как тестировать UI приложения?
3. Чем отличается Mock от Stub. (mock - имитация поведения, stub - вводные данные)

# Дополнительно

1. Как работают push-уведомления?
2. Какие Вы знаете паттерны? (Observer, Singleton, Responder chain, Factory)
3. Отличие архитектур MVC, MVVM, MVP, VIPER?
4. В чем разница между SVN и Git?
5. Что такое Bridge Header? Как использовать Objective-C код в Swift проекте?
6. NSCoding, archiving для чего используются?
7. Что такое ленивая загрузка?
8. Что такое Generics?
9. Что такое профилировщик, какие бывают. Какие использовали?

##### 1
```
func update() -> Int {
    var value = 1
    defer {
        value = 0
    }
    return value
}

let value = update()
print(value)
```
