OC语言核心语法

来源:互联网 发布:去哪里学it 编辑:程序博客网 时间:2024/05/01 07:22

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、点语法

   1. 点语法的本质是方法调用(并不是直接访问成员变量)

      stu.age=10  相当于 [stu  setAge:10]        (赋值为set方法)

      int age=stu.age  相当于int age=[stu age]  (取出为get方法)

二、成员变量的作用域

   1. 成员变量的作用域有以下四种

    (1)@public:任何地方都能直接访问对象的成员变量

    (2)@private:只能在当前类的对象方法中直接访问

    (3)protected:能在当前类和子类的对象方法中直接访问

    (4)package:只要处在同一框架中,就能直接访问对象的成员变量

   2. 如果什么都不写,默认为@protected

   3. 方法实现中(.m文件)也可以定义成员变量,默认为@private(因为main函数中只包含.h文件,而且定义的成员变量不能和              @interface中同名)

   4. @interface和@implementation中不能声明同名的成员变量

   5. OC为单继承,一个类只能继承一个父类

      父类(超类)superclass

      子类  subclass

三、@property和@synthesize

   1. @property用在@interface中,会自动生成某个成员变量的set 和get方法的声明和实现,并且生成了_age这个成员变量

      @interface Person:NSObject

     {

          int _age

     }

       @property int age        //相当于-(void)setAge : (int)age;    -(int)age;

   2. @synthesize用在@implementation中,会自动生成某个成员变量的set和get方法的实现,并且访问_age这个成员变量

      @implementation Person

      @synthesize age=_age

      //@synthesize age=_age       相当于

       -(void)setAge:(int)age;

        {

           _age=age;

        }

           -(int)age;

        {

          return _age;

        }

   3. 如果只写了@synthesize age,默认访问age这个成员变量,如果没有age这个成员变量,会生成age这个成员变量

   4. @synthesize age=_age 访问的是_age这个成员变量

   5. 如果一个类没有定义成员变量,@synthesize age=_age会自动生成@private类型的_age变量

   6. XCODE4.4之后,@property可以同时生成set和get方法的声明和实现

*结论: @property可以替代@synthesize,生成成员变量,并且生成了set和get方法的声明和实现

   7. 写了@property,若自己定义了set方法,编译器只会生成get方法和成员变量

      写了@property,若自己定义了get方法,编译器只会生成set方法和成员变量

      写了@property,若自己定义了set和get方法,编译器就不会生成不存在的成员变量 

四、id(类型)

   1. id是万能指针,能操作任何OC对象

   2. id相当于NSObject *

   3. id d=[Person new]; [d,setAge:10]

   4. id后面不要加*

五、构造方法(用来初始化对象的方法,是个对象方法,以—开头)

  1. Person *p=[Person new];  //完整的创建一个可用的对象

    (1)分配存储空间(+alloc方法)

    (2)初始化          (- init方法)

     new方法做的事情

   (1)调用+alloc方法,分配存储空间   Person *p1=[Person alloc];

   (2)调用- init 方法,进行初始化(初始化完毕,默认为0)         Person *p2=[p1 init];

           Person *p=[Person new]; 就相当于Person *p3=[ [ Person alloc ] init ];

  2. init 就是构造方法

  3. 任何对象构造之前首先要调用父类的构造方法(init)

  4. 若想某个对象一创建出来,它的成员变量就是某个值(10),就重写构造方法(重写init)

     -(id)init

     {

         if(self=[super init])   //先调回super的init方法,如果对象初始化成功

       {    

          _age=10           //赋值

       }

      return self;       //返回初始化完毕的对象

     }

  5. 重写构造方法的步骤:(1)调用父类的构造方法,初始化父类([super init])

                                     (2)在进行子类内部成员变量的初始化

  6. 自定义构造方法

      规范:(1)一定是对象方法,以 - 开头

                (2)返回值一般都是id类型

                (3)方法名一般以initwith开头

      -(id)initwithName:(NSString*)name

    {

         if(self=[super init])   //先调回super的init方法,如果对象初始化成功

      {    

         _name=name          //赋值

      }

     return self;       //返回初始化完毕的对象

    }

六、分类(Category)(给类扩充一些方法)

   1. 格式

      分类的声明:@interface 类名(分类名称)            @end

      分类的实现:@implementation 类名(分类名称)      @end

   2. 作用:不改变原来类的内容的基础上为类增加一些新的方法

   3. 注意点:

    (1)分类只能增加方法,不能增加成员变量

    (2)分类的实现里面可以增加成员变量

    (3)分类可是重新实现原来类中的方法,但是会覆盖原来的方法,导致原来的方法不可再用

    (4)分类方法优先去分类中找,然后再去原来的类中找,最后再去父类中找(优先级:分类->原来类->父类)

七、类的深入探究

   1. 类也是一个Class类型的对象,简称类对象,类名就是类对象

   2. Class创建Person类对象,再利用Person类对象创建Person类型的对象

   3. 可以利用类对象调用类方法

   4. 程序启动时,加载项目中所有类,先加载父类再加载子类,类加载完毕之后会调用类和分类的+(void)load方法(仅一次)

      加载顺序:父类,子类,分类

   5. 当第一次使用这个类的时候就会调用一次+(void)initialize方法(初始化)

      先初始化父类,再初始化子类

八、description方法(对象方法)

  1.  默认情况下,利用NSLog和%@输出对象时,结果是<类名:对象地址>

  2. 利用NSLog和%@输出对象时,会调用对象的-description方法,description方法的返回值是(NSString*)

  3. 若想将对象的属性值(age=10,name="jack")打印出来,可以重写description方法

     -(NSString *)description

    {

      return [ NSString stringwithFormat : @"age is %d , name=%@" , _age , _name ];

    }

*注意点:不能在-description方法中使用NSLog打印self(死循环)

  4. 利用NSLog和%@输出类对象时,结果为类名,因为调用的是+description方法(类方法)

九、NSLog输出

   1. NSLog(@"%p",&p)               // 指针变量的地址

      NSLog(@"%p",p)                 // 对象的地址

      NSLog(@"%@",p)                // <类名:对象地址>

      NSLog(@"%d",_ _LINE_ _)    // 输出当前行号

      NSLog(@"%s",_ _FILE_ _)     // 输出文件路径

      NSLog(@"%s\n",_ _func_ _)  //输出所在函数名

   2. NSLog输出语言字符串的时候,不能有中文

十、SEL

   1. SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址,就可以调用方法

   2. 每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象就可以找到方法的地           址,进而调用方法

   3. SEL对象的创建

      SEL s=@selector(test);          //将test方法包装成一个SEL类型的数据

      SEL s2=NSSelectorFromstring(@"test");       //将test这个字符串包装成一个SEL类型的数据

   4. SEL对象的其他用法

      //将SEL对象转为NSString对象

       NSString*str=NSStringFormSelector(@selector(test));

       Person *p=[Person new];

     //调用对象p的test方法

      [p performSelector:@selector(test)];

0 0
原创粉丝点击