【4】IOS面试题--设计模型
- 格式:docx
- 大小:24.43 KB
- 文档页数:9
1、frame bouns 区别在view中画出区别frame: 该view在父view坐标系统中的位置和大小。
bounds:该view在本地坐标系统中的位置和大小center:该view的中心点在父view坐标系统中的位置和大小。
2、代理、单例手写代码3、设计模式延迟加载监听 kvo mvc4、深拷贝浅拷贝区别举例开发工程中哪些实现了这些 ios中哪个实现了深拷贝5、动画 view中哪里可以实现动画6、layer 与view的区别7、绘制图片文字你的思路8、你站在开发者角度为啥需要设计代理9、retain 与copy的区别10、多线程 nsthread nsoperetation gcd11、block __block为啥需要这个12、数据库实现中遇到的问题13、使用过的开源api 以及使用时遇到的问题以及是怎么解决的14、使用代理的好处为啥要使用代理与通知的区别15、同步队列异步队列区别16、怎么解决版本手机兼容性问题1.写一下UIButton与UITableView的层级结构2.Cocoa的Foundation对象与Core Foundation对象通过什么关键字进行转换?这些关键字有什么区别?3.KVO是什么?内部是怎么实现的?4.是否可以把比较耗时的操作放在NSNotificationCenter中处理?为什么?应该如何处理?5.利用NSOperation与NSOperationQueue处理多线程时,有3个NSOperation分别为A,B,C,要求A,B执行完之后,才执行C,如何做?6.在非ARC中,可以对哪些对象加上autorelease关键字,它的作用是什么?被autorelease修饰的对象什么时候释放?7详细说明一下App启动过程,从main文件开始说起.main中有什么函数,几个参数,作用是什么?8CAAnimation是做什么的?写一下它的层级结构(主要是写下其各种子类)?9.iOS7之前,后台执行内容有几种形式,都是什么?10.一个有序的序列M,判断其中是否有两个元素A,B的和为K?如何判断三个元素的A,B,C的和为K呢?1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?用过一些比较简单的功能,替换对象的Method,使用AssociatedObject来传值,根据一个Class来获取它的propertyList等等。
ios面试题iOS开发是近年来非常热门和具有挑战性的技术领域之一。
在面试过程中,面试官通常会提出一系列的iOS面试题,以评估应聘者的技术能力和经验。
本文将介绍一些常见的iOS面试题,并提供详细的解答。
1. 请解释MVC设计模式在iOS开发中的作用及优势。
答:MVC(Model-View-Controller)是一种常用的软件设计模式,用于将应用程序的数据、用户界面和业务逻辑进行分离。
在iOS开发中,MVC设计模式有以下作用和优势:- 分离数据和界面:将数据(Model)和用户界面(View)进行分离,使得设计更加清晰和可维护。
- 降低耦合性:通过Controller充当数据和界面之间的中介,实现它们之间的解耦。
- 提高重用性:由于数据、界面和业务逻辑分离,可以更方便地对它们进行重用,提高开发效率。
- 方便协同开发:开发团队可以根据MVC的结构,分工协作,保证项目的高效进行。
2. 请解释UIKit和Foundation框架的区别。
答:UIKit和Foundation是iOS开发中两个重要的框架。
- UIKit是一个用户界面框架,提供了开发iOS应用程序的基础组件,如按钮、标签、文本框等。
它是建立在Core Graphics和Core Animation之上,用于构建用户友好的界面。
- Foundation是一个基础框架,提供了iOS开发中常用的核心功能和数据结构,如字符串处理、日期处理、文件管理等。
它是建立在C语言的基础上,为iOS开发者提供了一系列方便的API。
3. 请解释iOS的生命周期及其对应的方法。
答:iOS应用的生命周期指的是应用从启动到关闭的整个过程,常见的生命周期方法有以下几个:- `application:didFinishLaunchingWithOptions:`:应用程序加载完成后第一个调用的方法,用于初始化应用的数据和设置。
- `applicationWillEnterForeground:`:应用从后台返回前台时调用,可以在该方法中进行数据更新和界面刷新等操作。
第1篇一、产品设计与创新类1. 如果桌上放置了一部旧iPhone,你能看到哪些材料?(考察应聘者对产品的洞察力和创新能力)2. 请设计一款可以解决全球饥饿问题的产品。
(考察应聘者的大局观和创新思维)3. 请用不超过10个字概括苹果公司的核心价值观。
(考察应聘者的提炼能力和对企业的理解)二、逻辑思维与问题解决类1. 如果准备了4杯水,却来了5位领导,应该如何分配?(考察应聘者的应变能力和团队协作精神)2. 帝国大厦有多重?(考察应聘者的观察力和逻辑推理能力)3. 每天有多少孩子出生?(考察应聘者的观察力和数据处理能力)三、个人价值观与职业规划类1. 你会是什么超级英雄?为什么?(考察应聘者的个性和价值观)2. 请描述你职业生涯中最难忘的一次失败经历,以及你从中学到了什么。
(考察应聘者的挫折承受能力和自我反省能力)3. 你认为自己的优势和劣势分别是什么?(考察应聘者的自我认知能力)四、沟通与团队协作类1. 如果你在团队中遇到了一个难以沟通的同事,你会如何处理?(考察应聘者的沟通能力和团队协作精神)2. 请设计一场针对苹果公司产品的发布会,包括演讲稿、PPT和现场互动环节。
(考察应聘者的策划能力和沟通能力)3. 你认为团队中最重要的是什么?(考察应聘者的团队观念和价值观)五、心理素质与抗压能力类1. 如果你在工作中遇到了一个难以解决的问题,你会如何应对?(考察应聘者的心理素质和抗压能力)2. 请描述一次你在压力下完成任务的经历,以及你如何应对压力。
(考察应聘者的心理素质和抗压能力)3. 你认为自己在面对挫折时,最需要的是什么?(考察应聘者的心理素质和抗压能力)六、社会热点与价值观类1. 如果你是苹果公司的CEO,你会如何应对当前全球贸易战?(考察应聘者的政治敏感度和全局观)2. 请谈谈你对人工智能发展的看法,以及你认为苹果公司应该如何应对?(考察应聘者的价值观和前瞻性)3. 你认为苹果公司应该如何在环保方面做出贡献?(考察应聘者的社会责任感和价值观)总之,苹果公司的奇葩面试题目不仅考验应聘者的专业知识,更考验其创新能力、应变能力和综合素质。
ios开发工程师面试题1. 演示你对iOS开发的理解和经验在这个部分中,可以回答以下问题:- 对iOS开发的理解是什么?- 你有多少年的iOS开发经验?- 在过去的项目中,你使用过哪些编程语言和框架?- 你最擅长的iOS开发方向是什么(如UI布局、网络通信、数据库等)?2. 解释什么是MVC模式,以及在iOS开发中如何应用在这个部分中,可以回答以下问题:- 什么是MVC模式?它由哪三个部分组成?- 在iOS开发中,Model部分通常负责什么?- 在iOS开发中,View部分通常负责什么?- 在iOS开发中,Controller部分通常负责什么?- 你在实际项目中如何应用MVC模式?3. 解释什么是Delegate模式,在iOS开发中如何应用在这个部分中,可以回答以下问题:- 什么是Delegate模式?它的优点是什么?- iOS开发中常见的Delegate模式的应用场景有哪些?- 在使用Delegate模式时,通常需要实现哪些方法?4. 什么是KVC和KVO,在iOS开发中如何使用在这个部分中,可以回答以下问题:- 什么是KVC(Key-Value Coding)?在哪些场景下使用KVC?- 什么是KVO(Key-Value Observing)?在哪些场景下使用KVO?- 在使用KVC和KVO时,常见的注意事项是什么?5. 请解释一下iOS中多线程和GCD在这个部分中,可以回答以下问题:- 什么是多线程?为什么在iOS开发中需要使用多线程?- GCD(Grand Central Dispatch)是什么?它有哪些优点?- 在iOS开发中,怎样使用GCD来实现多线程操作?6. 在开发过程中,你如何进行性能优化和内存管理在这个部分中,可以回答以下问题:- 在iOS开发中,常见的性能优化手段有哪些?- 在iOS开发中,常见的内存管理方法有哪些?- 你在实际项目中如何进行性能优化和内存管理?7. 请分享一下你在iOS开发中遇到的困难和解决方法在这个部分中,可以回答以下问题:- 在iOS开发中,你曾经遇到过哪些困难和挑战?- 你是如何解决这些问题的?是否有什么经验教训可以分享?8. 请分享一下你最骄傲的iOS开发项目在这个部分中,可以回答以下问题:- 你在iOS开发中参与过哪些项目?有没有特别骄傲的项目?- 请分享一下这个项目的背景和你在其中的角色和贡献。
北风网iOS面试题库(四)写在前面:“分享”看似在输出,但实际上是获得更多。
用我们北风网的口号就是“不懂得分享的人,不会很快乐;不懂得分享的教育,不是好教育”。
所以,我们北风网会不定期给大家分享一些干货,所有的内容仅供学习之用,也希望大家能将“分享的精神”传递下去。
一、CGD的底层实现(1)iOS和OS X的核心是XNU内核, GCD是基于XUN内核实现的(2)GCD的API全部在libdispatch库中(3)GCD的底层实现主要有Dispatch Queue 和Dispatch Source(4)Dispatch Queue——管理block操作(5)Dispatch Source——处理事件二、Notification是同步还是异步?Kvo 是同步还是异步?包括代理,这些都是同步的;监听和回调都是在同一个线程中执行。
三、Objective C中的selector是什么?可以理解@selector() 就是取类方法的编号,他的行为基本可以等同C语言中的函数指针,只不过C语言中,可以把函数名之间赋给一个函数指针,而Objective-C的类不能之间应用函数指针,这样只能做一个@selector语法来取。
它的结果是一个SEL类型,这个类型的本质是累方法的编号(函数地址).方法以selector为索引.selector的数据类型是SEL定义成char*,我们可以把它想象成int .每个方法的名字对应一个唯一的值。
四、iOS中哪些操作是属于私有api的范畴?私有API是指存放在PrivateFrameworks框架中的API 是苹果明确不能使用的API 也可以说,一般在官方文档和头文件中看不到,但是实际存在于框架中的API 就是私有API,具体在提交应用的时候回自动检测。
私有API的存在很大一部分是为了保护隐私和系统安全,进制开发者使用这些功能。
但是由于Objective-C的动态特性,使得实际上不可能存在真正意义的阻止调用这些API。
ios 常见面试题在iOS开发领域中,面试是评估候选人技术能力和知识水平的重要环节。
不同公司的面试题可能会有所不同,但有一些常见的面试题目是必备的。
本文将介绍一些iOS常见的面试题,并提供详细的回答和解析。
一、Objective-C相关问题1. 什么是Objective-C?Objective-C是一种基于C语言的面向对象编程语言,是iOS开发的主要编程语言。
它继承了C语言的特性,并添加了面向对象的能力和语法。
2. Objective-C中的@property关键字有什么作用?@property用于自动生成成员变量的getter和setter方法。
使用@property声明的变量可以直接通过点语法访问和修改。
3. 什么是Category?Category是Objective-C中一种扩展类的机制,可以在不改变原始类的情况下向类添加新的方法。
它可以用于为系统类或者自定义类添加新的功能。
4. 什么是Delegate(代理)模式?Delegate模式是一种设计模式,用于将对象之间的通信和事件处理分离。
通过使用Delegate,可以将一些特定的行为或功能委托给其他对象来实现。
二、iOS开发相关问题1. 什么是UIKit?UIKit是一个iOS开发框架,提供了一系列用于构建用户界面的类和工具。
它是iOS应用程序的核心框架,包括了视图、控制器、动画、手势识别等功能。
2. 什么是UIViewController?UIViewController是iOS开发中用于管理视图和处理用户交互的核心类。
每个屏幕上显示的内容都由一个或多个UIViewController来管理。
3. 什么是Autolayout(自动布局)?Autolayout是一种自动布局系统,用于定义界面元素之间的相对位置和尺寸关系。
它可以适应不同尺寸的设备和不同方向的屏幕,保持界面的稳定性和一致性。
4. 什么是MVC架构?MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序的逻辑分离成三个主要部分:模型、视图和控制器。
百度 ios面试题百度iOS面试题在iOS开发领域中,百度一直以来都是一家颇具实力和创新能力的公司。
为了能够顺利通过百度的iOS面试,我们需要对百度常见的iOS 面试题进行深入了解和准备。
本文将针对百度iOS面试题展开讨论并给出相应的答案,以帮助读者在准备面试时有所依据。
1. 什么是iOS中的Autorelease Pool?它的主要作用是什么?在iOS中,Autorelease Pool(自动释放池)是一种内存管理机制,用于管理autorelease对象,即需要延迟释放内存的对象。
其主要作用是延迟内存释放,提高内存利用率和性能。
当autorelease对象被添加到Autorelease Pool中时,系统会在合适的时机(通常是在当前的runloop结束时)自动释放这些对象。
2. 请描述下iOS中的内存管理机制。
在iOS中,内存管理主要依靠引用计数来完成。
当一个对象被引用时,其引用计数会加1,当引用计数为0时,对象将会被释放。
通过retain、release和autorelease等方法可以控制对象的引用计数。
iOS中引入了ARC(自动引用计数)机制,可以自动管理对象的引用计数,从而减少手动引用计数的工作。
3. 在iOS中,什么是代理模式?请举一个例子并说明其使用场景。
代理模式是一种常用的设计模式,在iOS开发中被广泛使用。
在代理模式中,一个类可以将某些任务委托给另一个类来完成,从而实现代码的分离和解耦。
一个常见的例子是UITableView的代理模式。
UITableView的DataSource和Delegate就是典型的代理模式的应用。
UITableView的DataSource负责提供数据源,Delegate负责处理用户交互等事件。
通过代理模式,我们可以将UITableView的数据源和事件处理逻辑抽离出来,更好地实现了业务逻辑的分离和复用。
4. 在iOS开发中,什么是MVC模式?请描述一下各个组成部分的作用。
ios内审试题及答案iOS内审试题及答案1. iOS开发语言是什么?- A. Java- B. Swift- C. Objective-C- D. Python- 答案:B. Swift2. iOS应用商店的名称是什么?- A. Google Play- B. App Store- C. Microsoft Store- D. Amazon Appstore- 答案:B. App Store3. 以下哪个是iOS开发中常用的设计模式?- A. MVC- B. MVVM- C. MVP- D. All of the above- 答案:D. All of the above4. 在iOS开发中,哪个框架用于处理用户界面? - A. Core Data- B. UIKit- C. Core Animation- D. Core Bluetooth- 答案:B. UIKit5. iOS设备上,哪个服务用于推送通知?- A. APNs- B. GCM- C. FCM- D. AWS SNS- 答案:A. APNs6. iOS开发中,哪个工具用于分析应用的性能?- A. Xcode- B. Instruments- C. Simulator- D. TestFlight- 答案:B. Instruments7. 在iOS中,哪个属性用于设置视图控制器的根视图? - A. rootView- B. rootViewController- C. rootViewControler- D. rootView- 答案:B. rootViewController8. iOS应用的最小部署目标版本是多少?- A. iOS 10- B. iOS 11- C. iOS 12- D. iOS 13- 答案:A. iOS 109. 在iOS开发中,哪个类用于管理网络请求?- A. URLSession- B. NSURLConnection- C. Alamofire- D. AFNetworking- 答案:A. URLSession10. iOS应用中,哪个方法用于处理应用生命周期事件? - A. `applicationDidFinishLaunching`- B. `viewDidLoad`- C. `viewWillAppear`- D. `viewDidAppear`- 答案:A. applicationDidFinishLaunching11. iOS开发中,哪个框架用于处理本地数据库?- A. CoreData- B. SQLite- C. Realm- D. All of the above- 答案:D. All of the above12. 在iOS开发中,哪个属性用于控制视图的可见性? - A. `hidden`- B. `visible`- C. `show`- D. `display`- 答案:A. hidden13. iOS开发中,哪个方法用于获取当前设备的方向? - A. `deviceOrientation`- B. `interfaceOrientation`- C. `currentOrientation`- D. `orientation`- 答案:B. interfaceOrientation14. 在iOS中,哪个类用于处理多线程?- A. `NSThread`- B. `UIThread`- C. `GCD`- D. `NSOperation`- 答案:A. NSThread15. iOS开发中,哪个方法用于在视图控制器中添加导航条按钮? - A. `addBarButton`- B. `addBarButtonItem`- C. `setNavigationBarItems`- D. `addNavigationItem`- 答案:B. addBarButtonItem请根据以上试题及答案进行复习和准备。
黑马程序员:IOS面试宝典之设计模式1. 什么是设计模式设计模式是为特定场景下的问题而定制的解决方案。
特定场景指问题所在的重复出现的场景,问题指特定环境下你想达成的目标。
同样的问题在不同的环境下会有不同的限制和挑战。
定制的解决方案是指在特定环境下克服了问题的限制条件而达成目标的一种设计。
2. 设计模式的分类设计模式分为三种类型,共23种。
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
3. 类工厂方法是什么?类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。
这些方法的形式是+ (type)className...(其中className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。
它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。
虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。
工厂方法则可以避免为可能没有用的对象盲目分配内存。
4. 单件实例是什么?Foundation 和Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。
举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。
当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。
ios高级开发面试题iOS开发在近年来得到了广泛的关注和应用。
为了在这个竞争激烈的领域中脱颖而出,对于iOS高级开发者来说,掌握一些核心的技术和知识点是非常重要的。
本文将从技术、设计、性能等方面探讨一些iOS高级开发面试题,帮助读者了解iOS开发的一些关键点。
一、架构与设计1. 请解释什么是MVC架构?它在iOS开发中的应用场景有哪些?MVC(Model-View-Controller)是一种软件设计模式,主要由三个部分组成:模型(Model)、视图(View)和控制器(Controller)。
在iOS开发中,MVC经常用来分离应用中的数据、用户界面和业务逻辑。
模型负责处理数据和业务逻辑,视图负责展示用户界面,而控制器则负责协调模型和视图之间的通讯。
2. 什么是单例模式?在iOS开发中如何实现单例模式?单例模式是一种创建型设计模式,它确保一个类只能创建一个实例,并提供全局访问点。
在iOS开发中,可以通过以下方式实现单例模式:```swiftclass Singleton {static let shared = Singleton()private init() {}}```通过使用`static let`关键字,我们可以创建一个静态的共享实例,而`private init()`则确保该类无法在外部被实例化。
二、性能优化1. 在iOS开发中,什么是视图重用?为什么需要进行视图重用?视图重用是指在滚动视图(如UITableView和UICollectionView)中重复使用视图,以减少内存占用和提高性能。
在列表或网格视图中,当某个视图滚出屏幕时,可以将其重用来显示新的内容,而不是创建一个全新的视图。
视图重用可以有效地减少内存开销和提高滚动性能,特别是在数据量较大的情况下。
通过使用复用标识符和重用队列,我们可以轻松地重用视图并更新其内容。
2. 在进行网络请求时,如何避免引起内存泄漏?内存泄漏是指应用程序中无用的内存对象无法被垃圾回收器回收的情况。
1.解释一下面向对象?
面向对象是一种程序设计的范型,同时也是一种程序开发的方法。
面向对象是将现实世界中的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。
面向对象更利于人的理解方式,对复杂的系统进行分析、设计与编程。
此外,面向对象能有效的提高编程的效率,通过封装技术、消息机制可以快速的搭建出一个系统。
面向对象主要内容:对象、类、方法。
面向对象的语言是高级的语言,比如java、c++、c#、OC等
面向对象的三大特性?
面向对象的三大特性:继承、封装、多态。
继承:子类自动共享父类非私有数据结构和方法的机制,是类之间的一种关系。
继承是面向对象语言特有的,面向过程的语言不具有继承特性。
Objective-C 是单继承。
继承提供了类的规范等级结构,使公共的特性能够共享,提高了软件的重用性。
类的继承性使所建的软件具有开发性、可扩充性,简化了对象、类的创建工作量,提高了代码的重用性。
封装:在面向对象的语言中,对象、类、方法都是一种封装。
对象是封装的最基本单位。
类的封装体现在每个类都有.h和.m两个文件,将定义与实现分开,内部的实现可以根据需要设置不同的作用域对信息提供保护。
.h头文件中放方法的声明(用户可见的外部接口),.m中方法的实现(用户不可见内部实现)。
方法的封装是最常见的,每个方法中封装了一个小的功能,这是单一职责的很好体现。
当然,我们使用的第三方框架和代码,也是一种封装。
封装可以使程序的结构更加清晰,将实现的信息封装隐藏,用的时候直接调用封装好的方法或者类,提高效率。
此外,可以减少程序间的相互依赖。
(修改代码的时候,只需要找到实现的方法修改,方法的调用等不需要修改)
多态:用父类指针指向子类的对象。
通过不同的对象调用相同的名称的方法,却产生不同的结果。
通过父类指针得到的几个对象,都调用了父类中某个方法,但实际上在运行的时候,是执行的自己真实类中的方法。
多态增强了软件的灵活性和重用性。
2.MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。
MVC是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
优势:使系统层次清晰,职责分明,易于维护敏捷原则:对扩展开放- 对修改封闭
开放封闭原则是面向对象原则的核心,思想为:软件实体应该是可扩展的,而不可修改的。
也就是说,对扩展是开放的,而对修改是封闭的。
1.对扩展开放,意味着有新的需求变化时,可以对现有的代码进行
扩展,以适应新的情况。
2.对修改封闭,意味着一旦设计完成,就可以独立完成其工作,而
不要对类有任何的修改。
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。
model与view之间是不能直接通信!
模型-视图-控制器模式。
MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
MVC分层有助于管理复杂的应用程序。
MVC模式的应用程序耦合性很低,重用性很高,适合多人共同开发的大型项目。
MVC就是用控制器把model与view隔开,也就是model与view之间没有任何交互,是控制器与model、控制器与view 之间交互。
model 用于封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。
view 是用户能够看到所有的界面上的view。
controller 是在应用程序的一个或多个视图对象和一个或多个模型对象之间,充当媒介。
MVC 缺点
没有明确的定义,分层的时候,有些需要好好考虑。
不适合小型项目,因为创建MVC需要花费一定的时间;并且分层之后,会增加结构的复杂性,可能产生过多新的操作,降低运行效率。
视图与控制器之间紧密联系,会妨碍他们独立重用;
因为视图与模型之间不能直接交互,因此需要多次调用控制器交互,这样视图与模型数据的访问效率比较低。
3.单例模式Singleton
单例设计模式是IOS开发中一种很重要很常用的一种设计模式。
确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
也就是,无论请求多少次,始终返回一个实例,也就是一个类只有一个实例。
优势:使用简单,延时求值,易于跨模块敏捷原则:单一职责原则(单一功能原则)实例:NSUserDefaults
[UIApplication sharedApplication] 等注意事项:确保使用者只能通过getInstance方法才能获得,单例类的唯一实例。
单例代码:
单例的创建分Non-ARC(非ARC)和ARC+GCD,后者现在用的比较广泛,它保证了线程的安全,满足了静态分析器的要求,还兼容了ARC,代码如下:
+(AccountManager *)sharedManager
{
static AccountManager *sharedAccountManagerInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedAccountManagerInstance = [[self alloc] init];
});
return sharedAccountManagerInstance;
}
代码分析:
通过这个类方法,可以得到当前类的单例对象。
在方法中先声明了一个实例,并初始化为nil,前面的static 关键字可以保证只执行一次为nil的操作。
dispatch_once_t 是多线程中的,保证只执行一次。
dispatch_once这个函数用于检查该代码块是否已经被调用过,通过它不仅可以保证块里面初始化的代码仅被运行一次,还能保证线程的安全。
4.工厂模式factory pattern
工厂模式是一种很常用的实例化对象的模式。
抽象出一个工厂类专门来实例化对象,被实例化的对象类继承自工厂类。
也就是在实例化对象的时候,通过工厂方法代替new或者alloc、init方法。
优势: 易于替换,面向对象的编程
敏捷原则:开放--封闭原则
工厂模式优缺点
优点:简单工厂模式的优点是客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。
缺点是工厂类几种了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类多结构复杂的时候,把所有创建工作放进一个工厂中来,回事后期程序的扩展较为困难。
通过优缺点的分析,我们可以再如下场景中使用简单工厂模式:
(1)工厂类负责创建的对象较少时;
(2)客户端只知道传入工厂类的参数,对于如何创建对象的逻辑不必关心时。
5. 观察者模式Observer
观察者模式完美的将观察者和被观察者分离开。
观察者模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖它的对象都得到通知并自动刷新。
在IOS开发中经典观察者模式的实现方式有:NSNotificationCenter、KVO等
优势: 解耦合
解耦合:把原来引用很紧密的对象通过中间一层的分离,不直接引用敏捷原则:开放—封闭原则
通知NSNotificationCenter:
一般为model层对controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
通知可以是一对一,也可以是一对多。
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。
kvo 键-值观察机制Key-Value Observing:
当制定的对象的属性被修改后,对象就会接到通知。
每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。
键值对改变通知的观察者,极大的简化了代码。
kvc 键-值编码Key-Value Coding:
是一种间接访问对象的属性。
使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
6. 代理模式
代理的目的是改变或传递控制链。
允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。
可以减少框架复杂度。
应用场景:当一个类的某些功能需要由别的类实现,但是又不确定由哪个类实现,可以使用代理实现。
实例:tableview、Scrollview等中的delegete…。