[温故知新]Objective-C简单基础

13年开始混迹iOS圈,如今也有快三年了。感觉现在遇到了瓶颈。最近思考了很多,觉得或许重温基础会有很大的好处,所以有了想写博客,重新深入理解、整理所有相关的知识。希望自己可以以此来突破瓶颈期。

Swift出来很久了,虽然一直嚷嚷着要学,但也因为无法学以致用,所以就耽搁了。这样还是不太好,有时候人真的是好矛盾啊,有些错误明明认知到了,却又不擅长主动。就好比项目里,那一堆堆烂代码一样,即使再不优雅,即使自己知道可以重新写一下,让它们更好看,但是却总是,还能用,别搞了。这其实也是我写博客的原因,克服惰性。

扯了点废话,下面开始温故而知新第一篇。

**

Objective-C

**
任何iOS开发,都不会陌生这个词,也经常简单念成obj-c。但我这个强迫症,在一般情况下,我很少打缩写。你问我为什么,因为Objective-C这个单词,就充满了苹果的味道。这种味道,是一种难以说明的味道。就好像之前有人讽刺苹果开发者,什么命名都不喜欢省略。对,我确实就是这样的人,我喜欢把变量、函数、宏、资源文件的各种名字都写的尽量的详细一些。这是苹果所提倡的。

Objective-C是什么?

首先,它是一门程序语言,iOS & Mac OS开发的语言,苹果专用的一门语言。很多乱七八糟的历史,我也不想说了,可以自行百度一下。我想说的是,我们应该关注的是它的语言特性。
1.Objective-C 是一个从C语言扩展而来的语言。所以它完全的兼容C语言。
2.Objective-C是一个面向对象的程序语言,但和C++不同的是,它是单一继承的,不支持多重继承。它是动态的,Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类(这一点在很多时候,你会发现:太好用啦~)。

Objective-C内存管理

Objective-C是依靠引用计数来分配内存的。简单的说,就是对象生成时,对象的引用计数会默认为1(alloc),引用时,需要将引用计数+1(retain),用完以后,需要将引用计数-1(release)。当引用计数为0时,对象将内存释放(dealloc)。
现在Objective-C已经基本采用了自动释放机制,由编译器去完成对象引用计数的增加和减少。但作为开发者,我们还是需要清楚的知道一个对象的生命周期才能防止程序错误的发生。
顺便讲一些关于属性的。属性的retain(strong)、assign、copy、weak修饰符,其实就是在set方法中,类变量引用方式的变化。举两个个例子:

@property (nonatomic, assign) Property *property;
-(void)setProperty:(Property*)property  
{  
     _property = property;  
} 

@property (nonatomic, strong) Property *property;
-(void)setProperty:(Property*)property
{
    [_property release];//在设置之前,先release,那么在设置的时候,就会自动将前面的一个引用release掉
    _property=[_property retain];//多了一个引用,retainCount+1
}

类别(Category)

类别这个名词和在Objective-C里作用来看,我其实一直不太能联系起来的。但是谁让苹果就这么命名了呢。类别的定义相对简单,也就是对现有类的一些扩展方法。
使用类别时需要注意,类别只能添加方法,但是无法添加实例变量。如果类别中重写了类里的方法,那么是执行类别的方法的。有人将这一点归结为类别的局限性,我其实是不赞成的。因为在很多工程中,可能一个基类的方法,在多处调用,而有些类(一般是应该在某个业务模块)可能因为一些原因,这个方法需要进行变化。改动不算很大,那么这个时候,我们可以考虑价格类别方法,来让这些变动的模块引用,这样会让其他地方保证代码的整洁性。其实,这也是类别诞生的原因,就是用来在尽量保证原有类的单一整洁性的前提下,去扩展这个类。不过,说实话,其实类别用的情况并不多。我个人认为,适合类别的情况一般是两种。一种是扩展系统的类,添加一些更好用的方法。另一种,是扩展分割公共方法。这其实都有一个共同点,就是类别一般情况下,是用来扩展被大量其他类调用的公共方法的类的,让这些类可以看起来更加模块化。

KVC

Objective-C一个非常便捷的特性就是KVC(Key-Value-Coding)。其实我不太知道怎么翻译,网上似乎也没有什么好的翻译,就是直接KVC。那就不纠结怎么翻译了吧。简单的说,就是可以直接通过valueForKey方法,访问到类的成员变量(即使是私有的不公开的)。甚至更进一步的,可以用valueForKeyPath,访问成员对象的成员变量。虽然这听上去还挺好的,但是我很少用,因为明明可以清楚的写出访问的是什么,根本没必要用KVC。但不能否认KVC是有一定作用的,因为在JSON解析上,你会发现它无比的好用,Git上也有很多自动化的解析,都是基于KVC原理来实现的。

KVO

KVO(Key-Value-Observing)是建立在KVC上的一个更好用的东西。我一直觉得在MVVM架构中,如果通过KVO实现视图模型和数据模型,甚至其它各层之间的监听,应该会给编码带来很多便捷的地方,比如你根本不需要在每次数据更新时,都要去刷新视图。但目前我还没有发现哪个项目这么做过,我很想尝试,或许在尝试之后会有一些心得,也希望尝试过的小伙伴,可以给我一些建议和意见以及需要注意的一些地方。我自己感觉,如果是基于KVO视图模型和数据模型层的架构,可能在性能和线程控制上会有一些问题。

代理和协议

随着Objective-C不断的发展,代理模式慢慢的在没落,被block所取代。但是,作为一个从iOS6一路走来的开发者,我还是对代理有着情怀,即使我已经承认:它或许真的没有block好用了。但是,有的时候,我还是会去使用它,毕竟它不用去定义每个block中的参数,在函数命名上,也能更加的说明回调的作用。
简单解释一下,代理和协议,在Objective-C中其实就是一种类与类之间的交互方式。A类和B类遵守一个协议,A类在请求B类帮一个忙(调用B类的共有函数),B类说OK,是你让我帮忙的(B设定A为自己的委托人),B类执行完了以后,告诉A类,你要我做的事情我做完啦,这是你要的东西,剩下的事情不关我了(B类调用A类的代理方法,并传递过去对映的参数)。这就是一个简单的代理过程。

Block

对于Block,其实可以说很多很多。为什么很多项目都选择用代理而不用Block呢?因为Block确实会有很多需要注意的地方,比如线程调度、循环引用等等。但是当你真的熟悉了Block以后,你会发现真!好!用!因为它比代理更直观、更方便、更快捷。不用在你要修改回调方法时,找的焦头烂额,最后发现这个代理其实是个optional。而block会把通知方法和回调方法全部整合在一起,让阅读和维护更方便。

好啦。对于Objective-C的简单介绍就这样了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值