IOS基础面试题
- 格式:pdf
- 大小:165.88 KB
- 文档页数:24
ios面试题及答案1.uiview 和 calayer 是什么关系?•uiview 继承 uiresponder,而 uiresponder 是响应者对象,可以对ios 中的事件响应及传递,calayer 没有继承自 uiresponder,所以 calayer 不具备响应处理事件的能力。
calayer 是 quartzcore 中的类,是一个比较底层的用来绘制内容的类,用来绘制ui•uiview 对 calayer 封装属性,对 uiview 设置frame、center、bounds 等位置信息时,其实都是uiview 对 calayer 进一层封装,使得我们可以很方便地设置控件的位置;例如圆角、阴影等属性, uiview就没有进一步封装,所以我们还是需要去设置 layer 的属性来实现功能。
•uiview 是 calayer 的代理,uiview 持有一个 calayer 的属性,并且是该属性的代理,用来提供一些 calayer行的数据,例如动画和绘制。
2.bounds 和 frame 的区别?•bounds:一般是相对于自身来说的,是控件的内部尺寸。
如果你修改了 bounds,那么子控件的相对位置也会发生改变。
•frame :是相对于父控件来说的,是控件的外部尺寸。
3.setneedsdisplay 和 layoutifneeded 两者是什么关系?[图片上传失败...(image-fe66cb-)]uiview的setneedsdisplay和setneedslayout两个方法都是异步执行的。
而setneedsdisplay会自动调用drawrect方法,这样可以拿到uigraphicsgetcurrentcontext进行绘制;而setneedslayout会默认调用layoutsubviews,给当前的视图做了标记;layoutifneeded 查找是否有标记,如果有标记及立刻刷新。
【5】IOS⾯试题--内存管理.doc1 .属性readwrite, readonly, assign, retain, copy, nonatomic, atomic各是什么作⽤,在那种情况下⽤?readwrite是可读可写特性;需要⽣成getter⽅法和setter ⽅法时使⽤readonly是只读特性只会⽣成getter⽅法不会⽣成setter ⽅法;不希望属性在类外改变assign是赋值特性,不涉及引⽤计数,弱引⽤,setter⽅法将传⼊参数赋值给实例变量;仅设置变量时;retain表⽰持有特性,setter⽅法将传⼊参数先保留,再赋值,传⼊参数的retaincount会+1;copy表⽰拷贝特性,setter⽅法将传⼊对象复制⼀份;需要完全⼀份新的变量时。
nonatomic⾮原⼦操作,不加同步,多线程访问可提⾼性能,但是线程不安全的。
决定编译器⽣成的setter getter是否是原⼦操作。
atomic原⼦操作,同步的,表⽰多线程安全,与nonatomic相反2. Difference between shallow copy and deep copy? 浅复制和深复制的区别?浅层复制:只复制指向对象的指针,⽽不复制引⽤对象本⾝。
深层复制:复制引⽤对象本⾝。
意思就是说我有个A对象,复制⼀份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同⼀个内存资源,复制的只不过是⼀个指针,对象本⾝资源。
对于深复制来说,A和A_copy指向的是两个不同的内存资源,他们是两份独⽴对象本⾝。
⽤⽹上⼀哥们通俗的话将就是:浅复制好⽐你和你的影⼦,你完蛋,你的影⼦也完蛋深复制好⽐你和你的克隆⼈,你完蛋,你的克隆⼈还活着。
3. 什么是栈内存(stack) ?什么是堆内存(heap) ? 栈内存:由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。
其操作⽅式类似于数据结构中的栈(先进后出)。
移动应用开发工程师面试题及答案一、基础理论知识1、请简要介绍一下移动应用开发的常见平台(如 iOS、Android 等),并说明它们的主要特点。
答案:iOS 平台具有封闭性和高度的安全性,其应用审核严格,用户体验较为一致。
它的开发语言主要是 ObjectiveC 和 Swift,开发工具是 Xcode。
Android 平台则具有开放性,设备多样性大,应用分发渠道多。
其开发语言主要是 Java 和 Kotlin,开发工具包括 Android Studio 等。
iOS 通常在性能优化和用户界面设计方面有较高的要求,而 Android 则需要考虑不同设备的兼容性。
2、什么是移动应用的响应式设计?在开发中如何实现?答案:响应式设计是指应用能够根据不同的屏幕尺寸、分辨率和设备方向,自动调整布局和显示效果,以提供最佳的用户体验。
实现响应式设计可以通过使用弹性布局、媒体查询、自适应图片等技术。
比如,使用 CSS 的媒体查询可以根据屏幕宽度设置不同的样式规则,确保在不同设备上的显示效果都合适。
3、谈谈你对移动应用性能优化的理解,包括常见的优化方法。
答案:移动应用性能优化旨在提高应用的响应速度、降低资源消耗和提高稳定性。
常见的优化方法包括:减少网络请求次数和数据量,优化图片加载,合理使用缓存,避免内存泄漏,优化算法和数据结构,以及对界面渲染进行优化等。
例如,通过压缩图片大小、使用懒加载来减少初始加载的数据量;通过及时释放不再使用的内存资源来避免内存泄漏。
二、开发工具与技术1、你熟悉哪些移动应用开发框架(如 React Native、Flutter 等)?它们的优缺点是什么?答案:React Native 优点是可以使用 JavaScript 开发,同时能复用部分 Web 开发的知识和代码,社区活跃,有丰富的第三方库。
缺点是性能可能不如原生开发,某些复杂的 UI 效果实现较困难。
Flutter 优点是性能出色,拥有丰富的自定义组件,开发效率高。
iOS开发直播相关面试题常见问题你昨天/这周学习了什么?你为什么热衷软件开发?你对哪一种控制系统比较熟悉?与否参予过github项目?是否参与过github或其他同类型网站的ios开源项目?恳请叙述一下你的ios应用领域研发流程。
是否熟知cocoapods?它是什么?如何运行的?恳请归纳一下你对软件许可的认知,及其对软件开发的影响。
请概括一下你在构建ios应用时的测试过程。
ios应用如何实现对其他语言、日期格式以及货币单位的支持?恳请叙述一下instruments及其促进作用。
关于ios技术恳请解释一下handoff就是什么,并详述它就是如何同时实现ios、mac/网页应用领域互通的。
icloud包含了哪些技术与服务?ios拓展就是指?若想列出一些热门或常用的范例?healthkit是什么?homekit就是什么?apple pay是什么?能否描述一下如何在应用中使用apple pay?恳请解释一下ios应用领域沙盒机制。
voiceover是什么?请举例解释一下ios中的辅助功能(accessibility)。
开发者如何使用这些功能?ios应用领域就是如何同时实现后台多任务处理(multitasking)的?game center针对ios游戏有哪些功能?ibeacons就是什么?cocoa/cocoa touch是什么?恳请归纳一下core audio,core data以及core location各就是什么。
它们对ios 应用领域有何意义?请描述spritekit和scenekit的作用。
metal就是什么?响应链(responder chain)是什么?它是如何发挥作用的?按钮和其他掌控方式对哪些操作方式作出澄清?appdelegate扮演着什么样的角色?恳请解释一下nsuserdefaults。
就你而言,你可以如何在磁盘中对数组对象展开序列化?你会如何储存用户的认证信息?答何为keychain服务?。
iOS⾯试题集锦(附答案)(个⼈精⼼整理)1、第三⽅库、masonry第三⽅⾃动布局是否⽤过,类⽅法和对象⽅法的区别2、MVC机制C对M:APIC对V:OutletV对C:T arget-action,Delegate,DatasourceM对C:Notification,KVO3、runtime机制runtime是⼀套⽐较底层的纯C语⾔API, 属于1个C语⾔库, 包含了很多底层的C语⾔API。
runtime ⽤来⼲什么呢??⽤在那些地⽅呢?怎么⽤呢?runtime是属于OC的底层, 可以进⾏⼀些⾮常底层的操作(⽤OC是⽆法现实的, 不好实现)在程序运⾏过程中, 动态创建⼀个类(⽐如KVO的底层实现)在程序运⾏过程中, 动态地为某个类添加属性\⽅法, 修改属性值\⽅法遍历⼀个类的所有成员变量(属性)\所有⽅法例如:我们需要对⼀个类的属性进⾏归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使⽤了runtime就可以动态设置!1>头⽂件利⽤头⽂件,我们可以查看到runtime中的各个⽅法!2>相关应⽤NSCoding(归档和解档, 利⽤runtime遍历模型对象的所有属性)字典–>模型(利⽤runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)KVO(利⽤runtime动态产⽣⼀个类)⽤于封装框架(想怎么改就怎么改)这就是我们runtime机制的只要运⽤⽅向3>相关函数objc_msgSend : 给对象发送消息class_copyMethodList : 遍历某个类所有的⽅法class_copyIvarList : 遍历某个类所有的成员变量class_…..这是我们学习runtime必须知道的函数!4.必备常识1> Ivar : 成员变量2> Method : 成员⽅法从上⾯例⼦中我们看到我们定义的成员变量,如果要是动态创建⽅法,可以使⽤Method,4、strong ,weak, assign有什么区别assign:简单赋值,不更改索引计数(Reference Counting)。
以下是几个常见的iOS 初中级面试题及答案:Q: What is Objective-C? A: Objective-C is a general-purpose programming language that was developed by Apple and is used to develop iOS and macOS applications.Q: What is Swift? A: Swift is a programming language that is also used to develop iOS and macOS apps.Q: What is MVC? A: Model-View-Controller (MVC) is a design pattern that separates data and functionality into three separate layers: model, view, and controller.Q: What is the difference between Cocoa Touch and UIKit? A: The main difference between Cocoa Touch and UIKit is that UIKit provides a library of graphical controls for building user interfaces while Cocoa Touch is a framework for developing touch-based apps on iOS and macOS.Q: How do UIAlertViews work in iOS? A: UIAlertViews are used to display messages to users, usually when an error occurs or as a confirmation prompt.Q: What is the delegate pattern? A: The delegate pattern is a way for one object to communicate with another object without knowing its class directly.Q: How does auto layout work in iOS? A: Auto layout is a feature of Interface Builder that allows developers to specify constraints for the layout of UI elements in the interface.。
iOS英文面试题1.Difference between shallow copy and deep copy?2.What is advantage of categories? What is difference between implementing a category and inheritance?3.Difference between categories and extensions?4.Difference between protocol in objective c and interfaces in java?5.What are KVO and KVC?6.What is purpose of delegates?7.What are mutable and immutable types in Objective C?8.When we call objective c is runtime language what does it mean?9.what is difference between NSNotification and protocol?10.What is push notification?11.Polymorphism?12.Singleton?13.What is responder chain?14.Difference between frame and bounds?15.Difference between method and selector?16.Is there any garbage collection mechanism in Objective C.?17.NSOperation queue?18.What is lazy loading?19.Can we use two tableview controllers on one viewcontroller?20.Can we use one tableview with two different datasources? How you will achieve this?21.What is advantage of using RESTful webservices?22.When to use NSMutableArray and when to use NSArray?23.What is the difference between REST and SOAP?24.Give us example of what are delegate methods and what are data source methods of uitableview.25.How many autorelease you can create in your application? Is there any limit?26.If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?27.When you will create an autorelease pool in your application?28.When retain count increase?29.Difference between copy and assign in objective c?30.What are commonly used NSObject class methods?31.What is convenience constructor?32.How to design universal application in Xcode?33.What is keyword atomic in Objective C?34.What are UIView animations?35.How can you store data in iPhone applications?36.What is coredata?37.What is NSManagedObject model?38.What is NSManagedobjectContext?39.What is predicate?40.What kind of persistence store we can use with coredata?。
苹果面试官30问苹果面试官30问1、你会如何向8岁的孩子解释路由器的工作原理?2、你最好的朋友是谁?3、如果你有两个鸡蛋,在不摔碎的前提下如何搞清楚它们可以从多高的高度扔下去不会碎?你有几个解决方案?4、形容一个你解决过的有趣的问题,并且详述你是如何解决的?5、每天都有多少孩子出生?6、桌子上有100枚硬币,其中有10枚朝上,90枚朝下,如何在不触摸不看的情况下找出哪些硬币是朝上的?如何将这些硬币分成朝上硬币数量相同的两堆?7、形容下你自己,是什么激励了你?8、如果我们雇用你,你最想做什么样的工作?9、有三个箱子,一个放着苹果,一个放着橘子,另外一个放着苹果和橘子。
这三个箱子被打乱顺序无法分出哪个箱子装着什么?你该如何在只打开一个箱子并取出其中一个水果的前提下,马上知道这些箱子里装的是什么水果?10、你正在面对一个生气的顾客,这个顾客在等待我们的服务的时候等待了20分钟,这让她很烦躁,并宣称她将去百思买或者微软的零售店买其他公司的电脑,你会怎么处理这个情况?11、你会怎么降低(公司)笔的费用成本?12、如果有个顾客带着他完全无法使用的老旧电脑来寻求我们的帮助,你会怎么处理?13、你觉得自己聪明么?14、描述你曾失败的一次经历,你从中获得什么样的教训?15、你曾对上司的决定表达过不同意么?你是如何表达的?举个例子并且阐述下你是如何处理的',结果是什么?16、你把一杯装满水的水杯放在转盘上,最先发生的是杯子从转盘上滑落还是水溅出来?17、你生命中最自豪的一件事是什么?18、我们为什么要雇用你?19、你觉得自己是有创意的人么?你曾想过什么有创意的事情呢?20、描述一个能体现你谦卑的事情。
21、解决顾客的问题和给顾客创造良好的体验,哪一个更重要?22、苹果为什么将公司名字AppleComputer Incorporated改成Apple Inc?23、展示一下你是如何帮助顾客的。
24、是什么让你走到了现在?25、这四年来你过的最好的一天是哪一天?最不好的是哪一天?26、当你作为顾客走进苹果零售店,你会首先注意到什么?27、你为什么想要加入苹果,如果苹果雇用你,你会想念上一份工作的什么部分?28、你是如何挑选自己喜欢的应用?29、接下来5年你想得到什么?30、你是怎么测试面包机的?。
1.多线程都有哪些实现,GCD要注意些什么。
三种线程优缺点?(1)NSThread:轻量级的方式(具有很少的规则和惯例,依赖的东西少),比较底层和原始。
需要自己手动管理线程的生命周期,同步的时候需要加锁来控制线程执行顺序,会增加系统开销。
不推荐使用。
(2)NSOperationQueue:一个NSoperation对象可以通过调用start方法执行任务,默认是同步执行;也可以将NSOperation添加到一个NSOperationQueue中执行,这时是异步的。
通过这个方式开启线程后,可以中途停止、继续、取消等操作。
如果想控制线程执行顺序,可以通过添加依赖完成。
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
对于上传、下载这种复杂的操作,推荐使用。
(3)GCD:苹果提供的,异步执行。
提高了代码执行效率和多核的利用率,性能更好。
对于复杂的不推荐使用,但是简单的提交数据推荐使用。
2. 在哪里用过哪些第三方库,在哪获取第三库?读过第三方代码没有?在开发的过程中,用过很多第三方类库,AFNetWorking、SDWebImage、MBProgressHUD、FMDB、EGOTableViewPullRefresh、ShareSDK等。
注意:提到的可能面试官都会问到。
大多是从Github、CocoaChina地方等下载。
第三方类库主要是用它的功能,对于比较优秀的代码自己也读了一下,写的非常棒,比如。
(这个时候可以详细介绍一个你最熟悉的第三方类库)3. 多个iphone版本适配?最简单有效的方式是通过autolayout+sizeclass来进行适配的,但是这种方式的缺点需要添加的约束比较多,对于手写的代码非常麻烦。
一般手写代码进行布局的时候,会选择第三方类库来做,比如FLKAutoLayout,可以用简单的一句代码完成对一个控件添加的全部约束,非常实用。
4. 上拉加载更多,下拉刷新如何实现?用EGOTableViewPullRefresh做的,上拉的时候,从服务器取一组新的数据,加到数组中,刷新界面;下拉的时候,从服务器取数据,更新数组,刷新界面。
第1篇第一部分:基础知识与技能测试一、选择题1. 以下哪个不是常见的操作系统类型?A. WindowsB. LinuxC. macOSD. Android2. 在Android开发中,以下哪个不是四大组件?A. ActivityB. ServiceC. Broadcast ReceiverD. Intent3. 在iOS开发中,以下哪个不是常用的UI框架?A. UIKitB. SwiftUIC. AppKitD. React Native4. 以下哪个不是JavaScript的一种数据类型?A. StringB. NumberC. BooleanD. Array5. 在Java中,以下哪个关键字用于声明一个接口?A. interfaceB. classC. extendsD. implements6. 以下哪个不是Python中的一种数据结构?A. ListB. TupleC. SetD. Dictionary7. 在C++中,以下哪个关键字用于定义一个静态成员函数?A. staticB. constC. volatileD. mutable8. 以下哪个不是SQL中的聚合函数?A. SUMB. AVGC. MAXD. WHERE9. 在CSS中,以下哪个选择器用于选择所有子元素?A. childB. descendantC. general siblingD. adjacent sibling10. 以下哪个不是HTML5中的语义化标签?A. headerB. navC. footerD. div二、填空题1. 在Java中,一个类的构造函数必须与类的名字相同,且没有返回值类型,包括_______。
2. 在Python中,可以使用_______来定义一个函数。
3. 在HTML中,_______标签用于定义标题。
4. 在CSS中,_______属性用于设置元素的字体大小。
5. 在JavaScript中,可以使用_______来定义一个数组。
Object-C有私有方法吗?私有变量呢?objective-c–类里面的方法只有两种,静态方法和实例方法.这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类里面声名一个私有方法@interface Controller:NSObject{NSString*something;}+(void)thisIsAStaticMethod;–(void)thisIsAnInstanceMethod;@end@interface Controller (private)-(void)thisIsAPrivateMethod;@end@private可以用来修饰私有变量在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的关键字const什么含义const意味着”只读”,下面的声明都是什么意思?const int a;int const a;const int*a;int*const a;int const*a const;前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:·;关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)·;通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
·;合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug的出现。
欲阻止一个变量被改变,可以使用const关键字。
在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
关键字volatile有什么含义?并给出三个不同例子?一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:·并行设备的硬件寄存器(如:状态寄存器)·一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)·多线程应用中被几个任务共享的变量·一个参数既可以是const还可以是volatile吗?解释为什么。
·一个指针可以是volatile吗?解释为什么。
下面是答案:·是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。
·是的。
尽管这并不很常见。
一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
static作用?函数体内static变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
#import和#include的区别,@class代表什么?@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import而#import比起#include的好处就是不会引起重复包含线程和进程的区别?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
堆和栈的区别?管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。
申请大小:栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。
因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。
这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
堆的大小受限于计算机系统中有效的虚拟内存。
由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出分配方式:堆都是动态分配的,没有静态分配的堆。
栈有2种分配方式:静态分配和动态分配。
静态分配是编译器完成的,比如局部变量的分配。
动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
堆则是C/C++函数库提供的,它的机制是很复杂的。
Object-C的内存管理?1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.2.当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.3.如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?循环引用所有的引用计数系统,都存在循环应用的问题。
例如下面的引用关系:·对象a创建并引用到了对象b.·对象b创建并引用到了对象c.·对象c创建并引用到了对象b.这时候b和c的引用计数分别是2和1。
当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。
b不释放,c的引用计数就是1,c也不会被释放。
从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。
比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。
如果一个UITableViewController对象a 通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a,如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。
自己在设计使用delegate模式时,也要注意这点。
定义属性时,什么情况使用copy、assign、retain?assign用于简单数据类型,如NSInteger,double,bool,retain 和copy用于对象,copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。
retain会使计数器加一,也可以解决assign的问题。
另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。
加了atomic,setter函数会变成下面这样:if(property!=newValue){[propertyrelease];property=[newValue retain];}对象是什么时候被release的?引用计数为0时。
autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release。
对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。