Object C读书笔记

日期: 2013年11月15日 标签: 读书笔记

做ios也有一定经验了,可还没有系统的学习过object-c,现在抽点时间,系统的看一下吧!


一. 关于类,对象和方法

以前也接触过很多面向对象的语言,然而object的使用却和别的有所不同, 开始的时候不太适应,但是慢慢发现他其实很简介明了!

  • 类的申明

    @interface ClassName: NSObject //类似与java的类的声明 父类为NSobject

    @implementation ClassName //是以上申明类的实现部分

  • 类的初始化

     1.方法一
     Fraction *myFraction;
     myFraction = [Fraction alloc];  //申请地址空间
     myFraction = [myFraction init]; //对象初始化
     2.方法二
     Fraction *name = [[Fraction alloc] init];
    

方法

  • 使用 方法

  • 分类 1.类方法

我认为这类似与java中的静态方法,可以直接用类名去调用,类可以不实例化

+ (方法返回类型) 方法名 : (参数类型) 参数名

2.对象实例方法

这个方法必须类经过实例化以后,利用实例化后的对象去调用

- (方法返回类型) 方法名 : (参数类型) 参数名


二. 循环结构

  • object-c 中循环结构和java,c,c++ 差不多,无非就是for,while,do

  • 关于循环中的推出

** break

当执行到错误或者不想再执行的条件时,退出循环

** continue

跳出本次循环,执行下次循环


三.选择语句

  • The if statement

       if ( expression )
           program statement 1
         else
           program statement 2
    
  • The switch statement

       switch ( expression )
        {
        case value1:
        program statement
        program statement
        ...
        break;
        case value2:
        program statement
        program statement
        ...
        break;
        ...
        case valuen:
        program statementThe switch Statement
        program statement
        ...
        break;
        default:
        program statement
        program statement
        ...
        break;
        }
    
  • The conditional operator

      condition ? expression1 : expression2
    

四.关于类的补充

在写大型项目时,要很好的组织结构要将类分离,连接,组合

1.申明实现分离

将@interface 写在.h中,将实现写在.m中,这个c++特性有点类似!

2.Synthesized Accessor Methods

这是object-c的一个新特性,它类似与java或者c++中的set和get方法,只不 过他把这两个方法内置了!你只需要在interface模块中用@property 定义你 的属性。

  • interface

      @interface Fraction : NSObject
      @property int numerator, denominator;
      -(void)
      print;
      -(double) convertToNum;
      @end
    
  • implement

      #import "Fraction.h"
      @implementation Fraction
      @synthesize numerator, denominator;
      -(void) print
      {
      NSLog (@"%i/%i", numerator, denominator);
      }
      -(double) convertToNum
      {
      if (denominator != 0)
      return (double) numerator / denominator;
      else
      return NAN;
      }
      @end
    

3.使用.去控制属性

如果属性使用以上方法定义了,或者手工写了set和get方法,就可以直接用 实例+.+属性去给属性赋值或者得到属性的值

4.作用域

5.关于继承

关于继承和java 是类似的;

  • object有个root class 叫做NSObject

  • @class 当要利用到外部类的时候,利用@class引入该类

有人会说哪和#import 作用不是一样, 其实是有区别的:

1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

所以,一般来说,@class是放在interface中的,只是为了在interface中引用 这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果 需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明 的类进来.

6.动态

听到动态,我第一个想到的是java的反射机制,在程序运行时,动态获取类状态, 并可以改变其属性

关于id

这样说好理解一些,id就类似与java中的最基类,object,所有子类都可以向 上强转成object,当使用子类方法时,又可以转回来,调用子类方法。 id比 java这种机制要好很多,我的理解是它是一个指针,指向什么它就是什么,并 可以调用其指向的类的方法!

  • id动态绑定

所谓动态,就是运行时,将id于实际的类绑定,这一看就比java的强转高级, 利用id类型去调用方法不会报错,在程序运行的时候它会去动态查看绑定的类, 然后调用方法。

五.关于值扩展

1.作用范围

  • @private

    作用范围只能在自身类

  • @protected

    作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。

  • @public

    作用范围最大,在任何地方

  • @package

    对于framwork是protected 对于外部是@pravita

2.关于_

3.全局变量使用

  • 在代理中定义,不要初始化,在调用的地方 extern val=**;

  • 使用单例实现:

      xxxAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
      appDelegate.Your Variable
    

4.关于静态变量

  • 在m文件中定义

  • 作用域为单一文件

  • 建立一个静态函数,对其静态变量进行操作。

5.枚举

  • object-c中

      enum flag { false=0, true=1 };
    
  • c++ 中

       typedef NS_ENUM(NSInteger, Test)  
       {  
       TestA       = 1,      //1   1   1  
       TestB       = 1 << 1, //2   2   10      转换成 10进制  2  
       TestC       = 1 << 2, //4   3   100     转换成 10进制  4  
       TestD       = 1 << 3, //8   4   1000    转换成 10进制  8  
       TestE       = 1 << 4  //16  5   10000   转换成 10进制  16  
       };  
    

<-->