SlideShare a Scribd company logo
1 of 50
Download to read offline
Dependecy injection
in iOS
Iurii Mozharovskyi, iOS engineer
Agenda
1. Anti-patterns
2. SOLID, DIP, IoC, DI
3. DI in practice
2
Sorry, but your code is
STUPID!
It is offending. Nobody would like to hear that.
3
What makes code STUPID?
Singleton
Tight coupling
Untestability
Premature optimization
Indescriptive naming
Duplication
4
Singleton
• Single instance of class
• Global access
class WeatherService {
static let sharedInstance = WeatherService()
}
5
Why Singleton is bad?
• Global access and lifetime
• Difficult to replace/mock implementation
• Dependencies are hidden in code
• Tight coupling
6
class WeatherViewController {
func update() {
let weatherService = WeatherService.sharedInstance
weatherService.loadData { ... }
}
}
Service locator
7
Service locator
class ServiceLocator {
static let sharedInstance = ServiceLocator()
func weatherService() -> WeatherService {...}
func settingsService() -> SettingsService {...}
func adService() -> ADService {...}
func analytics() -> Analytics {...}
}
class WeatherViewController {
func update() {
let weatherService =
ServiceLocator.sharedInstance.weatherService
weatherService.loadData { ... }
}
}
8
Why Service Locator is bad?
• Classes are dependent from Service Locator
• Dependencies are hidden in code
• Access to all available services of Service Locator
9
Don’t be STUPID: GRASP
SOLID!
Single responsibility principle
Open/closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
10
Dependency Inversion
Principle
• High-level modules should not depend on low-level
modules. Both should depend on abstractions.
• Abstractions should not depend on details. Details
should depend on abstractions.
11
Dependency Inversion
Principle
12
Inversion of control
13
Inversion of control
class WeatherViewController: UIViewController {
init(weatherService: WeatherService) {}
}
...
class Assembly {
private let weatherService: WeatherService =
WeatherServiceImpl()
func weatherViewController() -> WeatherViewController {
return WeatherViewController(
weatherService: weatherService)
}
}
14
Dependency injection
Way of passing dependency to class:
• Constructor injection
• Method injection
• Property injection
15
Constructor injection
protocol WeatherService {}
class WeatherServiceImpl: WeatherService {}
class WeatherViewController: UIViewController {
init(weatherService: WeatherService) {}
}
16
Method injection
protocol WeatherService {}
class WeatherServiceImpl: WeatherService {}
class WeatherViewController: UIViewController {
func update(weatherService: WeatherService) {}
}
17
Property injection
protocol WeatherService {}
class WeatherServiceImpl: WeatherService {}
class WeatherViewController: UIViewController {
var weatherService: WeatherService?
}
18
DIP, IoC, DI
• DIP - recommendations for dependencies design
• IoC - how dependencies are managed
• DI - way of passing dependency
19
DI
Pros:
• Splits app into loosely-coupled components
• Removes dependency creation/search responsibility
• Reusable Code
• Testable Code
Cons:
• You need to manage dependencies
20
Example app “Weather”
21
• https://github.com/iuriimoz/Weather
• Client for OpenWeatherMap API (http://
openweathermap.org/api)
22
Assembly
• Creates UI & business logic
objects
• Injects dependencies
• UI & business logic classes
don’t know about assembly
23
User
interface
Business
logic
Assembly
Inversion of control
24
Subassemblies
25
Master Assembly
• Instantiates subassemblies
• Wires connections between subassemblies
• Keeps strong references to subassemblies
26
Master Assembly
class MasterAssembly {
private let _servicesAssembly = ServicesAssemblyImpl()
private let _mainStoryAssembly = MainStoryAssemblyImpl()
private let _settingsStoryAssembly = SettingsStoryAssemblyImpl()
init() {
let storyAssemblies: [AbstractStoryAssembly] =
[_mainStoryAssembly, _settingsStoryAssembly]
storyAssemblies.forEach { storyAssembly in
storyAssembly.servicesAssembly = _servicesAssembly
}
_mainStoryAssembly.settingsStoryAssembly = _settingsStoryAssembly
}
var mainStoryAssembly: MainStoryAssembly {
return _mainStoryAssembly
}
}
27
Where Assembly starts
class AppDelegate: UIResponder, UIApplicationDelegate {
...
private let masterAssembly = MasterAssembly()
func application(_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: …) -> Bool {
...
window?.rootViewController =
masterAssembly.mainStoryAssembly.initialScren()
...
}
}
28
UI & business logic classes
don’t know about assembly
• How to implement transition from view controller A
to view controller B?
• Does A know about B?
• Who creates B?
29
Transition between modules
30
Classes are developed
independently
31
Assembly establishes
connections
32
DI-framework
• removes boilerplate code
• helps to wire up complex object relationships
• auto injection when possible
33
DI-framework
• Java - Spring
• Android - Dagger
• iOS - Typhoon, Swinject
34
Typhoon
• DI-framework for Objective-C & Swift.
• https://github.com/appsquickly/Typhoon (★2282)
35
Typhoon features
• Written in Obj-C with extensive usage of runtime
• Initializer/Property/Method Injections
• Circular Dependency Injection
• Storyboards auto-injection support
• Modularity
36
Typhoon example
@protocol WeatherService
@end
@interface WeatherServiceImpl: NSObject<WeatherService>
@end
@interface WeatherViewController: UIViewController
- (instancetype)initWithWeatherService:(id<WeatherService>)weatherService;
@end
37
Create a sub-class of
TyphoonAssembly
@interface MyTyphoonAssembly : TyphoonAssembly
- (id<WeatherService>)weatherService;
- (UIViewController *)weatherViewController;
@end
38
Dene instances to be built
@implementation MyTyphoonAssembly
- (id<WeatherService>)weatherService {
return [TyphoonDefinition withClass:WeatherServiceImpl.class];
}
- (UIViewController *)weatherViewController {
return
[TyphoonDefinition withClass:WeatherViewController.class
configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(initWithWeatherService:)
parameters:^(TyphoonMethod *initializer) {
[initializer injectParameterWith:[self weatherService]];
}];
}];
}
@end
39
Obtain built instances from the
assembly
MyTyphoonAssembly *assembly = [[MyTyphoonAssembly new] activated];
UIViewController *weatherVC = [assembly weatherViewController];
40
Typhoon cons
• Swift classes should be subclassed from
NSObject.
• Need to understand how it works internally
• No compile time checks
• Hard to debug
41
Typhoon debugging
42
Swinject
• Dependency injection framework for Swift
• https://github.com/Swinject/Swinject (★1963)
43
Swinject features
• Written in Swift for Swift without runtime usage
• Initializer/Property/Method Injections
• Circular Dependency Injection
• Optional storyboards auto-injection extension
• Modularity
• Thread safety
44
Swinject example
let weatherVCID = "WeatherVC";
let container = Container()
container.register(WeatherService.self) { _ in WeatherServiceImpl() }
container.register(UIViewController.self, name: weatherVCID) {
resolver in
let weatherService = resolver.resolve(WeatherService.self)!
return WeatherViewController(weatherService: weatherService)
}
let weatherVC = container.resolve(UIViewController.self,
name: weatherVCID)!
45
Swinject cons
• Need to understand how it works internally
• No compile time checks
46
Handmade Assembly vs DI-
frameworks
• Try handmade Assembly
• Try DI-frameworks
• Make your personal choice
47
Summary
• DI is good, it makes everyone happy
• Use DI in your projects
48
Thank you!
Questions?
49
References
https://github.com/iuriimoz/Weather
http://williamdurand.fr/2013/07/30/from-stupid-to-solid-code/
https://nikic.github.io/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html
https://martinfowler.com/bliki/InversionOfControl.html
https://martinfowler.com/articles/injection.html
http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/
http://sergeyteplyakov.blogspot.com/2014/11/di-vs-dip-vs-ioc.html
https://habrahabr.ru/company/rambler-co/blog/258325/
https://github.com/appsquickly/Typhoon
https://github.com/Swinject/Swinject
50

More Related Content

What's hot

Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
Theo Jungeblut
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
Marco Mangia Musardo
 

What's hot (20)

MVVM & RxSwift
MVVM & RxSwiftMVVM & RxSwift
MVVM & RxSwift
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency Injection
 
Presentation facade design pattern
Presentation facade design patternPresentation facade design pattern
Presentation facade design pattern
 
Favor composition over inheritance
Favor composition over inheritanceFavor composition over inheritance
Favor composition over inheritance
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Clean code: SOLID (iOS)
Clean code: SOLID (iOS)Clean code: SOLID (iOS)
Clean code: SOLID (iOS)
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Dependency injection ppt
Dependency injection pptDependency injection ppt
Dependency injection ppt
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
 
Design Pattern - Factory Method Pattern
Design Pattern - Factory Method PatternDesign Pattern - Factory Method Pattern
Design Pattern - Factory Method Pattern
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
 
Swift in SwiftUI
Swift in SwiftUISwift in SwiftUI
Swift in SwiftUI
 
Sling Models Using Sightly and JSP by Deepak Khetawat
Sling Models Using Sightly and JSP by Deepak KhetawatSling Models Using Sightly and JSP by Deepak Khetawat
Sling Models Using Sightly and JSP by Deepak Khetawat
 
SOLID
SOLIDSOLID
SOLID
 
Ios development
Ios developmentIos development
Ios development
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Microservices with Java, Spring Boot and Spring Cloud
Microservices with Java, Spring Boot and Spring CloudMicroservices with Java, Spring Boot and Spring Cloud
Microservices with Java, Spring Boot and Spring Cloud
 

Similar to Dependency injection in iOS

Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
prideconan
 
谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability
drewz lin
 
Clean Code Part II - Dependency Injection at SoCal Code Camp
Clean Code Part II - Dependency Injection at SoCal Code CampClean Code Part II - Dependency Injection at SoCal Code Camp
Clean Code Part II - Dependency Injection at SoCal Code Camp
Theo Jungeblut
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug in
GR8Conf
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
Jerome Dochez
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing Architectures
Victor Rentea
 

Similar to Dependency injection in iOS (20)

Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
 
Cut your Dependencies with Dependency Injection for East Bay.NET User Group
Cut your Dependencies with Dependency Injection for East Bay.NET User Group Cut your Dependencies with Dependency Injection for East Bay.NET User Group
Cut your Dependencies with Dependency Injection for East Bay.NET User Group
 
谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability
 
Cut your Dependencies with Dependency Injection - .NET User Group Osnabrueck
Cut your Dependencies with Dependency Injection - .NET User Group OsnabrueckCut your Dependencies with Dependency Injection - .NET User Group Osnabrueck
Cut your Dependencies with Dependency Injection - .NET User Group Osnabrueck
 
Context and Dependency Injection
Context and Dependency InjectionContext and Dependency Injection
Context and Dependency Injection
 
Cut your Dependencies - Dependency Injection at Silicon Valley Code Camp
Cut your Dependencies - Dependency Injection at Silicon Valley Code CampCut your Dependencies - Dependency Injection at Silicon Valley Code Camp
Cut your Dependencies - Dependency Injection at Silicon Valley Code Camp
 
Clean Code Part II - Dependency Injection at SoCal Code Camp
Clean Code Part II - Dependency Injection at SoCal Code CampClean Code Part II - Dependency Injection at SoCal Code Camp
Clean Code Part II - Dependency Injection at SoCal Code Camp
 
Leveraging Dependency Injection(DI) in Universal Applications - Tamir Dresher
Leveraging Dependency Injection(DI) in Universal Applications -  Tamir DresherLeveraging Dependency Injection(DI) in Universal Applications -  Tamir Dresher
Leveraging Dependency Injection(DI) in Universal Applications - Tamir Dresher
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Improving app performance with Kotlin Coroutines
Improving app performance with Kotlin CoroutinesImproving app performance with Kotlin Coroutines
Improving app performance with Kotlin Coroutines
 
SOLID & IoC Principles
SOLID & IoC PrinciplesSOLID & IoC Principles
SOLID & IoC Principles
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug in
 
Getting your app ready for android n
Getting your app ready for android nGetting your app ready for android n
Getting your app ready for android n
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)
Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)
Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing Architectures
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Comment dĂŠvelopper une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment dĂŠvelopper une application mobile en 8 semaines - Meetup PAUG 24-01-2023Comment dĂŠvelopper une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment dĂŠvelopper une application mobile en 8 semaines - Meetup PAUG 24-01-2023
 

Recently uploaded

%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Recently uploaded (20)

Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 

Dependency injection in iOS