Straybird’s Blog

A blog for life and study

iOS学习笔记1

接触iOS这个平台也有1年多的时间了,中途有看过一些书,也看过一些博客,但终究觉得是纸上得来终觉浅。最近也好好思考了一下,对于iOS的学习一直都是随性的,想到啥了就学啥,导致的结果就是有些部分因为比较感兴趣,学的比较深入,有些部分却是一个完完全全的初学者,所以当自己想去写点什么的时候,总是有点力不从心。总结了一下,现在对于objetctive-c的语法,以及ios的内存管理,多线程等方面至少是应该跨过了初学者的层次,但是对于view,controller还有Apple提供的api等知道的甚少。正好最近有同事推荐了iOS Programming: The Big Nerd Ranch Guides,网上看了一下,觉得挺不错的,对于现阶段的我,正好可以查缺补漏,同时练手和巩固已有知识。这个学习笔记系列也就是我学习过程中的一些记录。

id和instancetype

instanceytype只能够作为返回值类型,并且会返回当前的class类型,相对于id而言,其可以让编译器帮我们做更多的事情。之前我也想过,为什么初始化中一定要返回id或者instancetype,不能直接返回类类型呢?在书中也找到了答案,其实很简单,如果类被子类化了怎么办?子类覆盖?我们知道objeitive-c中是不能有selector名字一致但是返回类型不一致的方法的。

view/controller相关

Point和Pixel

涉及到viewer层面,就不得不提Point和Pixel了,Point的大小参数是保持一致的,根据屏幕分辨率的不同,其对应的Pixel的数量会发生改变。在非Retina屏中,1个Point就是Pixel,但在Retina中,一个Point变为了2*2Pixel。所以对于图片而言,苹果提高了非常便捷的方式,就是用2份图片,在Retina中使用的在名字后加上@2x就可以了。

lazy loading

对于view而言,没有显示在屏幕之上前,viewcontroller是没有必要去loading的,同时也考虑到移动端的内存,我们应该尽量做到这样。所以我们一定要注意,没有必要的时候不要在这之前调用self.view,尤其不要在init中调用,这样会造成view的提前加载。

xib命名

xib的命名最好与viewcontroller的名字保持一致,这是为什么呢?因为initWithNibName调用时,如果发现nib参数为空,会检测与viewcontroller同名的nib文件,也就是说名字保持一致后,就可以直接使用init初始化了,这样是不是方便很多?

File’s owner

对于xib而言,设置file’s owner非常重要,这是为什么呢,如果不设置,当viewcontroller加载nib时,元素都准备好了,却会发现自己的view指向nil,将xib的file’s owner设置为对应的view controller,就可以将view的outlet设置为file’s owner了,这样,加载的时候,view controller成为file’s owner,就能找到对应的view了。

outlet的背后

在xib上设置outlet只需要简单的拖动,那实际上view上的元素outlet到底是怎么跟viewcontroller中的property连接起来的呢?这背后其作用的就是kvc(key-value coding)了,首先会寻找setter/getter,然后是成员变量(var和_var),所以当设置好outlet之后,如果将对应的property改名,就会寻找不到,也是这个原因。

Core Graphics

Core Graphics是用纯c语言实现的2D作图引擎,其中有一些以Ref结尾的类型需要注意,他们其实是指针对象的,用Ref又作了一层封装以与其他的Core框架对象保持一致(Core Foundation中也有很多这样的),尽管这些对象是存在堆上的,但是ARC不帮忙管理内存,需要我们自己管理。大部分时候我们我们都会选用跟高层面的实现UIBezierPath,但是阴影和渐变只能用Core Foundation实现。

这一篇记录的也比较杂,主要是根据学习的顺序吧,记录的目的也就是帮助自己巩固知新。

参考文献

书籍: iOS Programming: The Big Nerd Ranch Guides

Comments