首页 > 代码库 > IOS强化知识(1)认识Objective-C

IOS强化知识(1)认识Objective-C

    一直想写一个整体的Objective-C的帖子,总是没时间,所以我想把大知识变小,小知识变更小,每天写一点点,来把自己学习的东西与大家分享,好了废话不多说


1、一门动态的语言OC


    Object-C(以下简称OC)是一门面向对象语言,这恐怕学过编程的人都知道。但是OC跟其他语言相比,显得格格不入。因为它是一门消息结构语言,而非函数调用。所以语法上显得很怪,通常是这样:

         [对象消息];

    

     但是消息型语言有一个好处,就是它的动态性。其运行时所执行的代码都是动态的,根据当时运行环境决定。而函数式语言,所执行的代码编译阶段就已经确定。函数式语言编译的时候需要查询函数表才能知道到底运行那段代码。而消息式语言,编译时期无需知道该运行哪段代码,因为它总是到运行的时候,才会去找。它甚至不需要知道消息对象的类型,而这一个过程称之为“动态绑定”。


     所以OC的运行时不同于其他语言,OC重要的工作都在“运行期组件”中完成,OC的所有特性以及内存管理都在“运行期组件”完成,“运行期组件”本质是动态库。而代码能把开发者所写的所有代码组合起来。这样的话,只需要更新“运行期组件”就能提高程序性能,而那些函数式语言就需要重新编译。




2、“堆内存”和“栈内存”

    与C++不同,OC不允许将OC对象的内存分配到栈(stack)上,只能分配到堆(heap)上。

     C++     string str = "123"; 合法

     OC      NSString str = @"123";非法


  OC必须用一个指针指向一个OC对象,如:

      NSString* str = @"123";合法

      而大家都知道指针的内存分配到栈上 。


         所以例如:    

       NSString* str2 = str;

       这仅仅是进行一次指针的拷贝,并没有分配新的空间。


       用一张图来描述就是这样:


      分配在栈上的内存,系统自动清理。而分配到堆上的内存由程序员来清理。而OC本身实现了引用计数模式管理内存。


      但有时候,你会发现有些变量定义不含“ * ”。那么他们可能会分配在栈上。(id除外,因为它本身已经是指针)

     

      OC是C得超集,完全兼容C所以基本类型和结构体是允许分配到栈上的,比如:

      NSInteger  CGFloat CGRect   CGPoint  int double BOOL 等等。


      创建结构的开销远远小于对象。如果你对C语言不是太熟悉,那么你得努力了。



3、引用计数与自动引用计数(ARC)

     引用计数是内存管理的一种策略,简言之,每一个对象需要维护一个整数,这个整数记录了该对象被引用的次数,如果有新的引用(指针的拷贝)指向该对象,那么引用计数+1,当失去一个引用的指向时,引用-1,当没有任何引用指向该对象时,对象被销毁。

       因为OC只允许对象分配到堆上,所以引用计数对于OC非常合适。但是引用计数维护成本略高,而且容易出错,引用计数过多,造成内存泄露,过少,出现野指针,对于经验少的程序员,很难做到平衡,需要熟悉这套机制,并且熟悉对应的API。所以高级的编译器支持自动引用计数,将引用计数的工作交给编译器,编译器通过检测针对引用计数进行控制,但是它也有自己的规则,以后的帖子会讲到。


今天就讲到这个里,多谢观看。


今天的要点:

OC是C得超级,增加了面向对象性,OC使用动态绑定的消息结构,只有运行时才能知道对象的类型,以及需要执行的代码,不由编译器决定。

理解堆内存存放的是什么,栈内存存放的什么。


IOS强化知识(1)认识Objective-C