zoukankan      html  css  js  c++  java
  • 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非常合适。可是引用计数维护成本略高,并且easy出错,引用计数过多,造成内存泄露。过少。出现野指针,对于经验少的程序猿,非常难做到平衡。须要熟悉这套机制,并且熟悉相应的API。所以高级的编译器支持自己主动引用计数,将引用计数的工作交给编译器,编译器通过检測针对引用计数进行控制。可是它也有自己的规则。以后的帖子会讲到。


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


    今天的要点:

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

    理解什么是存储在堆内存,什么堆栈存储器。


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    (原)Lazarus 异构平台下多层架构思路、DataSet转换核心代码
    (学)新版动态表单研发,阶段成果3
    (学) 如何将 Oracle 序列 重置 清零 How to reset an Oracle sequence
    (学)XtraReport WebService Print 报错
    (原)三星 i6410 刷机 短信 无法 保存 解决 办法
    (原) Devexpress 汉化包 制作工具、测试程序
    linux下网络配置
    apache自带ab.exe小工具使用小结
    Yii::app()用法小结
    PDO使用小结
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4865689.html
Copyright © 2011-2022 走看看