OC 深入浅出 讲解
文章平均质量分 50
最前面的OC知识点的讲解,将OC的每一个知识点 ,深入浅出的讲解
中意_中意
这个作者很懒,什么都没留下…
展开
-
给tabBar设置图片和字体颜色的几种方法
现在很多应用都使用到了tabBar,我们往往在给tabBar设置图片和字体的时候,当选中状态下,往往字体的颜色和图片的颜色不匹配,有时候就显得无从下手,我也常常忘了,所有写这个博客的目的,相当于给自己做个笔记,也希望给有需要的朋友们一点帮助。写了个小demo,来演示这个问题: - (void)viewDidLoad { [super viewDidLoad]; ZYGroupBuy原创 2016-01-23 23:45:49 · 17795 阅读 · 0 评论 -
CABasicAnimation 使用的细节(跳转,后台,前台)处理
这回我们来总结一下CABasicAnimation使用中的一些细节的处理问题,避免一些比较蛋疼的事情发生,显得无从下手:一般的动画,我们这样写:///开始旋转 - (void)beginRotation{ CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]原创 2016-01-22 23:10:03 · 6111 阅读 · 0 评论 -
剖析运行时(让你看懂运行时)
运行时机制:比较高级的特性,纯C语言实际上我们平时写的OC代码,都是转成C语言的运行时代码,运行时代码的效率更高,更直接Person.h@interface Person : NSObject@property(nonatomic,assign)int age;@endmain.mint main(int argc, const char * argv[]) { @autorele原创 2016-01-21 21:10:17 · 1948 阅读 · 0 评论 -
自定义modal动画
在很多场景中,我们都需要实现各种动画,这回我们来尝试搞一下控制器间跳转的modal动画。 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ZYSecondViewController *second = [[ZYSecondViewController alloc]init];原创 2016-01-21 01:16:24 · 1225 阅读 · 1 评论 -
扫描二维码
其实扫描二维码,用到了这个框架:#import <AVFoundation/AVFoundation.h>@interface QRCodeViewController ()<AVCaptureMetadataOutputObjectsDelegate>@property (nonatomic, strong) AVCaptureSession *session;@endviewDidLoad原创 2016-01-19 22:09:27 · 1382 阅读 · 0 评论 -
生成二维码
我们简单的使用一下CIFilter来完成二维码的生成,解剖一下二维码的生成过程查找到 kCICategoryBuiltIn 内建的滤镜名NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; NSLog(@"%@",filterNames);找到这个CIQRCodeGenerator@prop原创 2016-01-19 12:39:15 · 1958 阅读 · 0 评论 -
精简版—愤怒的小鸟
首先我们要布局一下,使用sizeclass来布局:连线过来:@property (weak, nonatomic) IBOutlet UIButton *bird;@property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *ices;对于冰块的连线,因为我们这里的冰块有4块,所以我们直接连的是一个数组懒加载一个U原创 2016-01-18 23:31:25 · 1979 阅读 · 0 评论 -
经验之谈—正则表达式实现图文混排
在项目中,我们经常需要发表情,以及经常需要将表情字符转换成表情。因为表情是一个图片,所以我们发给服务器的时候,实际上是发一段特殊的文字给服务器,然后转换成表情。以免浪费用户过多的流量。那接下来,我们就来介绍一下,如何使用正则表达式实现图文混排呢?为了以后的代码的管理方便,我们抽取出两个类:NSString+Regular.h中,我们暴露两个方法出来:/** * 返回正则表达式匹配的第一个结原创 2016-01-06 23:08:50 · 2713 阅读 · 0 评论 -
经验之谈—实现图片下拉放大的效果
这里我们主要是用一下,如何能保持原来的图片的宽高比来轻松的实现放大的效果,主要的是UIViewContentModeScaleAspectFill这个起的效果:我们用tableView来展示这个效果吧我们这里并没有计算图片的宽高比,直接用UIViewContentModeScaleAspectFill来实现#import "ViewController.h"const CGFloat ZYTop原创 2015-12-22 19:15:12 · 11971 阅读 · 0 评论 -
经验之谈—如何让图片长的好看(contentMode)
我们在开发中,经常要在view,tableView,等显示图片,比如我们发微博(带有图片的),那么我们常常要考虑如何处理这些图片,是否拉伸,拉伸到什么样的效果等等,常常是需要考虑的问题其实主要的还是要理解UIImageView的ContentMode的这些参数,这些参数一般就能满分我们的开发需求 UIViewContentModeScaleToFill, UIViewContentMod原创 2015-12-22 19:02:16 · 3632 阅读 · 0 评论 -
经验之谈—UIButton传值通过枚举
其实在我们开发中,经常会遇到有些朋友写的代码里面,由很多的数字,如果你突然看到了一堆的1,2,3,4,5,或者switch判断里面,case 1: cae 2: case 3 等等,这些代码往往给人很蒙的感觉。无从下手,其实这就是我们所说的可读性很差的代码。其实说起可读性的话,那么我们现在也顺便说一下注释的问题(题外话),其实我们发现,很多大公司,写的注释反而很少,为什么,因为他们的代码就是原创 2015-12-22 12:27:49 · 2609 阅读 · 0 评论 -
经验之谈—项目如何分模块(MVC)
一般来说,无非就两种情况: 我们假如一个项目是长这样子的: 随便找一个来说,比如找美团的:按MVC来分模块根目录Controller团购上门商家我的更多Model团购上门商家我的更多View 团购上门商家我的更多按模块来分MVC团购 ControllerModelView上门ControllerModelView商家ControllerModel原创 2015-12-22 09:01:19 · 5764 阅读 · 0 评论 -
经验之谈—如何快速熟悉公司的旧项目
我们打个比方,假如你去到一家公司,然后一开始,要下载公司的旧代码,接下来就是熟悉公司的旧代码,假如这个项目是两三年前做的,那么一直搞到现在,假设有10万行代码,那么让你来熟悉这些旧代码,然后在旧代码的基础上,增加新的功能模块,是非常苦逼的,有时候,都不懂怎么入手。如果你想从上往下一行一行的来阅读,那么当你花了大量的时间去阅读完之后,一无所获,看完之后,都忘了。这时候,就显得非常的悲催。。。方法:搜原创 2015-12-19 20:29:02 · 9048 阅读 · 4 评论 -
经验之谈—OAuth授权流程图
其实我们在开发中,经常需要解决获得用户的一些特定的数据,比如:可以选择使用微博登陆,使用QQ登陆等等,然后我们间接的获得用户的头像,昵称等信息。这些都涉及到OAuth授权的内容OAuth授权有这么几个特点: OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准OAuth 的授权不会使第三方触及到用户的帐号信息OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在原创 2015-12-19 09:46:18 · 2310 阅读 · 0 评论 -
Pod安装 第三方框架
可能有些朋友在开发中,需要用到第三方框架的时候,都是直接拖进项目里面,然后引入需要的头文件,开始操作。其实也能把项目做出来。但是由于第三方框架一般依赖于系统的一些框架,所以你导入第三方框架的时候,编译之后,还得去导入系统的一些框架,造成一些比较繁琐的工作。所以使用pod来安装,第三方框架,就显得比较便捷。比如项目中,我们需要用到以下第三方框架: AFNetworking SDWebImage原创 2015-12-19 09:35:05 · 3212 阅读 · 0 评论 -
经验之谈—自定义tabbar(继承于UITabBar)
自定义tabbar一般来说有两种方式,一种是继承于系统的UITabBar,一种是继承与UIView的tabbar。我们现在来看一下继承与UITabBar这种情况中需要注意的一些细节。其实继承与UITabBar我们无非是想修改一下tabbar中的子控件的frame或者是添加子控件等。我们接下来添加一个按钮到自定义的tabbar上。注意的地方:我们先打印一下看看UITabBar里面存在的子控件:原创 2015-12-16 23:58:00 · 1915 阅读 · 0 评论 -
经验之谈—如何避免第三方框架过分的污染我们的项目
其实一直在纠结。若第三方框架在我们项目中多处地方被使用到,而这个框架又经常更新,若出现更新说:此次更新,修改了之前的什么大bug。若更新之后,造成了我们的项目,无法运行,那么我们要修改的地方就非常多,因为前期对这个框架过分的依赖。怎么办?一个个去找,去修改,那代价是惨重的。那么如何避免这种情况呢,让这些经常更新,经常变动的框架对我们的项目的影响将到最低呢,我们想,若这个框架只影响到我们项目的一处地原创 2015-12-16 12:09:14 · 1560 阅读 · 0 评论 -
经验之谈—父子控制器(验证苹果的一句话)
苹果官方有一句话说的非常好:当控制器的view互为父子关系,那么控制器最好也互为父子关系我之前有一篇博客说控制器view的显示里边我说了一个很严重的问题,就是当控制的view还在,但是控制器不在了,造成了数据无法显示的问题,所以我们就要想办法保住控制器的命。那么我们今天继续来看一下,如何保住控制器的命。今天我们来用屏幕旋转的一个案例来说明一个问题:当控制器的view互为父子关系的时候,控制器不是父原创 2015-12-16 09:29:58 · 2556 阅读 · 2 评论 -
经验之谈—让你看明白block
其实我感觉不经常使用block的朋友,对block应该是比较陌生的,那么现在我们来扒开block的真面目,看看block的本质普通的局部变量,block内部只会引用它初始的值(block定义那一刻),不能跟踪它的改变void test(){ int age = 10; void (^block)() = ^{ // 普通的局部变量,block内部只会引用它初始的值原创 2015-12-16 00:04:15 · 1421 阅读 · 1 评论 -
经验之谈—控制器的view的显示
开发中,我们经常需要将一个控制器的view添加到另一个控制器的view上,这种效果是我们期望看到的,但是里边隐藏着一些细节,不注意的话,可能会达不到我们想到的效果。先举个例子给大家看一下: 我们创建一个ZYTestViewController : UITableViewController 然后我们稍微实现以下tableview的数据源方法#pragma mark - Table view原创 2015-12-14 09:00:25 · 4265 阅读 · 1 评论 -
经验之谈—KVC(forKey,forKeyPath)
KVC是Cocoa一个大招,非常牛逼。利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 如:Person.m文件中:@implementation Person{ @private double _height;}- (void)printHeight{ NSLog(@"height是%f", _height);}@endPerson原创 2015-12-14 00:57:03 · 4349 阅读 · 0 评论 -
经验之谈—坐标系的转换
项目中,经常使用到坐标的转换,因为有些控件在布局的时候,可能参考点不一致,所以造成的frame不是我们想要的。我们举个例子来说明一下:- (void)viewDidLoad{ [super viewDidLoad]; // 蓝色 UIView *blue = [[UIView alloc] init]; blue.backgroundColor = [UIColo原创 2015-12-14 00:31:44 · 2707 阅读 · 0 评论 -
经验之谈—PCH 中使用:const 与宏
很多时候,由于开发的需要,我们常常需要在pch中定义一些在整个项目中都用得到的变量等一般来说,在以前的开发过程中,我们都习惯于直接在pch中写一个宏就搞定了。但是我们仔细的分析苹果官方文档,会发现,他里面定义的一些变量,不是用宏定义的,而是用const那我们就要知道为什么用const了,首先了解一下const的一些基本的使用,在C语言的语法中,若我们若const休息一些变量会出现什么情况,简单了原创 2015-12-13 23:58:08 · 2076 阅读 · 0 评论 -
经验之谈—initWithFrame;initWithCoder;awakeFromNib
首先说一下,这几个方法在我们自定义控件的时候,会经常调用。但是具体的是什么时候应该调用什么方法,现在我来总结一下这几个方法分别在什么时候调用:initWithFrame一般的写法: - (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { //代码 }原创 2015-12-13 09:35:32 · 5376 阅读 · 0 评论 -
最方便,好用的单例—实现一行代码创建单例
一般来说,我们在一个类中写单例,要是想考虑的全面,那么要考虑到各个因素。因为我们不知道别人创建单例的时候,通过什么创建的。所以我们就必须把通过各个方式创建的单例,都写出来:+(instancetype)sharedSoundTool{ static id instance = nil; static dispatch_once_t onceToken; dispatch_原创 2015-11-29 21:47:12 · 3076 阅读 · 2 评论 -
运行时的最常见的三种用法
今天,我们来说说运行时的最常见的三种用法,在之前的一篇博客中,已经介绍了使用运行时给分类添加属性,详见:运行时给分类添加属性前提条件,必须导入相关的头文件:#import <objc/runtime.h>那么剩下的两个用法:动态获取某个类的所有属性首先创建一个person类,设置两个属性,看能否获取的到我们的这两个属性: ZYPerson.h@interface ZYPerson : N原创 2015-11-29 10:34:29 · 976 阅读 · 0 评论 -
定时器造成的内存泄露
很多时候,我们都需要用到定时器,但是我们使用定时器的时候,稍不注意,就会出现内存泄露的问题,造成的对象无法销毁的问题我们先看一下代码,我们一般是这么来运用定时器的:- (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@s原创 2015-11-28 21:25:54 · 8958 阅读 · 1 评论 -
代理模式 之案例
案例 去北京….Person.h#import <Foundation/Foundation.h>#import "ZaiRenProtocol.h"@interface Person : NSObject@property(nonatomic,copy)NSString *name;@property(nonatomic,strong)id<ZaiRenProtocol> traffic原创 2015-10-01 12:03:18 · 507 阅读 · 0 评论 -
代理设计模式
什么是代理模式.传入的对象,代替当前类完成了某个功能,称为代理模式.利用协议实现代理模式的主要思路定义1个协议.里面声明代理类需要实现的方法列表. 比如这里的1个代理类需要实现载人的方法.创建1个代理类 遵守上面的代理协议 并实现方法在需要代理的类中,定义1个对象属性 类型为id 且遵守代理协议的属性.在代理的类中,调用代理对象的方法.代理模式:有1个对象中有1个属性, 这个属性的可以是任意的原创 2015-10-01 11:45:46 · 1372 阅读 · 0 评论 -
协议的使用案例—找女朋友
说一下这个案例的需求: - 有1个男孩子 找对象的标准. - 必须 会做饭和洗衣服. - 如果有国企工作优先考虑.GFProtocol.h#import <Foundation/Foundation.h>@protocol GFProtocol <NSObject>@required- (void)washClothes;- (void)cook;@optional- (void)j原创 2015-10-01 11:37:28 · 601 阅读 · 0 评论 -
协议的类型限制
声明1个指针,这个指针指向的对象要求遵守指定的协议.什么类型的对象都可以,唯一的要求就是这个对象要遵守指定的协议.NSObject<协议名称> *obj;这个obj指针只能指向遵守了指定协议的任何对象. 如果没有遵守这个协议 那么编译器会报1个大大的警告.之所以,要求对象要遵守某个协议,是因为我们后面要调用这个对象中的协议方法.其实也可以使用id指针.id指针的好处不会做编译检查. 和NSOb原创 2015-10-01 11:21:07 · 1101 阅读 · 0 评论 -
协议的基本使用
协议:protocol作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明.协议的声明 @protocol 协议名称 <NSObject> //方法的声明; @end新建1个协议的方式. NewFile OC-File - protocol协议的文件名: .h 并且只有1原创 2015-10-01 11:10:05 · 3821 阅读 · 0 评论 -
block与方法 排序各个国家的名称
什么时候block需要作为方法的参数.在方法的内部实现功能的时候.如果在实现某个子功能的时候.如果不确定到底如何实现.只有调用者清楚. 那就让调用者写1段代码实现这个功能 把这个代码通过block参数传递进来.block可以作为函数、方法的返回值. block与函数的异同. 相同点: 都可以封装1段代码在其中.. 不同点:. block是1个数据类型. 而函数就是函数.. block可以作为原创 2015-10-01 10:55:21 · 1336 阅读 · 0 评论 -
block与函数
block是1个数据类型. 所以block类型完全可以作为函数的参数或者返回值.block作为函数的参数. 形参就直接声明1个符合要求的block变量就可以了.如果觉得恶心,可以使用typedef简化定义.. 实参代码段的要求必须要和形参的要求一致.如果形参是1个无返回值无参数的block 那么实参的代码段也必须要符合这个要求.. 在传值的时候.先将符合要求的代码段存储在1个block变量之原创 2015-10-01 10:26:20 · 1166 阅读 · 0 评论 -
block
block类型的变量的声明虽然block类型的变量是用来存储1断代码的.但是1个block类型的变量并不是任意的代码段都可以存储的 而是有限定的.在声明block变量的时候,必须要指定这个block变量存储的代码的返回值类型是什么,参数是什么.一旦指定. 那么这个block变量中就只能存储这种类型的代码段.. 在声明block变量的时候,必须要指定这个block可以存储的代码段的返回值类型和参原创 2015-10-01 10:17:37 · 1056 阅读 · 0 评论 -
延展
延展(Extension).是1个特殊的分类.延展是1个分类.比较特殊.所以它的作用:也是用来扩展1个类.特殊在于:-> 这个分类没有名字.叫做匿名分类-> 这个分类只有声明.不能有单独的实现. 与本类共享1个实现. @interface Student () @end我们新建1个延展.只会生成1个.h文件. 这个延展的声明@interface 本类名 ()@end没有单独的实原创 2015-10-01 09:55:21 · 2113 阅读 · 2 评论 -
单例模式
. 单例模式. 顾名思义: 单个实例. 单个对象.无论创建多少个对象,也无论创建多少次对象,我希望创建出来的对象都是同1个对象.alloc方法作用: 申请空间.创建对象. 只要是创建对象,一定会调用alloc方法.alloc方法的内部. 就是调用了allocWithZone:方法.并且不建议去重写alloc方法.allocWithZone:做的事情: 它才是真正的申请空间创建对象.并且将创建的对原创 2015-09-30 22:11:05 · 1452 阅读 · 2 评论 -
copy 其他
关于引用计数器的问题. 字符串的引用计数器 存储在常量区的字符串对象不允许被回收.所以引用计数器是1个很大的数 并且不允许被改变.存储在堆区中的字符串的引用计数器一开始创建出来是1.浅拷贝的时候.不会产生新对象 但是会让对象的引用计数器+1深拷贝的时候,会产生对象. 产生的新对象的引用计数器为1 原来的对象的引用计数器不变.自定义类实现copy的功能.copy方法是定义在NSObject原创 2015-09-30 22:03:28 · 779 阅读 · 0 评论 -
copy
copy 拷贝.copy是1个定义在NSObject类之中的1个方法.言下之意就是说所有的OC对象都有这个方法.copy方法的作用: 拷贝、复制1个对象.copy方法.NSString –> copy —> NSString对象. 没有新对象产生,把原来的对象的地址直接返回.像这样的拷贝对象的方式叫做浅拷贝.把对象的地址返回,没有产生新对象.NSMutableString –> copy ->原创 2015-09-30 21:48:47 · 803 阅读 · 0 评论 -
集合的内存管理
集合的内存管理.NSArray、NSDictionary都叫做集合 . 在MRC模式下. 当我们将1个OC对象存储到集合之中.这个OC对象的引用计数器会+1当集合被回收的时候,会向存储在集合之中的对象发送1条release消息.. 以@[] @{}创建的集合本身就已经是被autorelase过的了.. 在ARC模式下.集合的元素是1个强类型的指针.原创 2015-09-30 21:40:43 · 1014 阅读 · 0 评论