zoukankan      html  css  js  c++  java
  • OC----初识

    OC中的.h文件, 是类的声明文件,用来声明函数(方法),变量
    OC中的.m文件,是类的实现文件,用来实现.h中声明的函数(方法)
    类的声明使用:@interface ——@end
                        如果在.m文件中使用@interface----@end称为类扩展,一般是私有扩展
    类的实现使用:@implementation——@end
    在.h中声明的所有方法作用域都是public类型的,不能更改
    成员变量的作用域有三种:
    1. @public 全局都可以访问
    2. @protected 只能在类内部和子类中访问(默认是protected) 
    3. @private 只能在类内部访问
    比java少了一种作用域:包权限作用域,原因很明显:OC没有包名的概念。
    直接访问成员变量:对象->成员变量;
    设置成员变量的作用域:
    复制代码
    @public 
    int age;
    int no;
    
    @protected
    float height;
    
    @private
    float weight;
    复制代码
     
    减号“-”声明   代表动态方法(对象方法)
    加号“+”声明  代表静态方法(类方法)(所有对象可以直接引用,不需要创建新的对象)
     
    在OC中凡是类型都用括号括住:例如(int)age;
    声明中方法需要传递参数时,需要在方法后边加“:”一个冒号对应一个参数;
    而且冒号“:”也是方法名的一部分;
    传递两个参数:
    -(void)setAge:(int)age andNo:(int)no;
    //在.h文件中声明
    其中andNo可以省略,它只是为了让方法名念起来通顺一点;
     
     
    OC中利用指针返回对象:Student *stu=[Student alloc];
     
    创建一个Student对象的方法:
    //为student对象分配一个内存空间
    Student *stu=[Student alloc];
    //调用init动态方法初始化stu
    stu=[stu init];
     
    在开发中常用下边这种形式:
     
    Student *stu=[[Student alloc] init];
     
    访问公共成员变量:对象->成员变量;
     
    点语法:
    [student setAge:10]完全等价于 stu.age = 10;
    int age = [stu age]完全等价于 int age = stu.age;
     
    OC点语法的本质是方法调用,不是直接访问成员变量;
     
    构造方法:
    //自己声明一个构造方法
    -(void)initWithAge:(int)age andNo(int)no;
    实现构造方法:
    复制代码
    -(void)initWithAge:(int)age andNo:(int)no{
      if(self=[super init]{
        _age=age;
        _no=no;
        }
      return self;
    }
    复制代码
     
    OC中字符串的表示:
    char *s=“stu”//c语言中字符串的表示
    NSString *str=“stu”//OC中字符串的表示
     
    在java中this只能用在动态方法中,不能用在静态方法中
    用this代表调用这个动态方法的对象
     
    在OC中self既可以用在动态方法中,也可以用在静态方法中
    self用在动态方法中:表示调用这个动态方法的对象(self代表“对象”)
    self用在静态方法中:self表示的是当前方法的调用者,即当前的类(self代表“类”)
    万变不离其宗:self代表者当前方法的调用者
     
    如果直接把方法写在.m文件中,没有在.h文件中声明,那么这种方法就是私有方法
     
    空指针和野指针
    空指针:没有存储任何内存地址的指针就称为空指针
                  空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0
    野指针:不是空指针,是指向垃圾内存的指针
                  即,当创建一个对象,用指针指向它,然后销毁了这个对象,但这时指针    
                  还是指向这个已经销毁了的对象的内存地址,如果这时候利用指针去访问
                  这个地址,就是非法访问,这就是野指针
                  所以当销毁对象之后一般还要把指向对象的指针销毁或者赋值为空
     
    @property语法:当编译器遇到@property时,会自动展开为getter和setter的声明
    @property int age;
    //编译器会自动展开为以下方法声明
    -(void)setAge:(int)age;//set方法
    -(void)age;//get方法
    @synthesize语法:当编译器遇到@synthesize时,会自动展开为实现方法
                              并且@synthesize默认会去访问跟后边所写变量同名的变量
                              如果找不到同名变量,会自动生成一个私有的同名变量
    复制代码
    @synthesize int age;
    //编译器会自动展开为如下get和set方法
    -(void)setAge:(int)age{
       _age=age;
    }
    -(void)age{
     return _age;
    }
    复制代码
    当然也可以这样写:
    @property int age,no;//可同时property多个成员变量
     
    在Xcode 4.5之后只用在.h文件中写@property语句就可以,不用在.m文件中写@synthesize就可以实现方法
     
    如果没有在.m文件中没有写@synthesize 语句,(例如 @synthesize int age)
        那么编译器默认会访问(_成员变量)(例如 _age );
    如果在.h文件中没有(_成员变量)(例如 _age ),
        那么编译器会默认帮我们创建私有成员变量(_成员变量)(例如 _age );
     
    如何注释代码
    #pragma mark - 【此处为分组名】:用此种方法代表对所写方法分组
    #pragma mark 【方法注释】:用此种方法表示注释所写方法
     
     
    @class语法
    如果在.h文件中用到了某些类可以用@class声明,这样可以调高编译器性能
    @class 语法:使用@class可以提高编译器性能
    @class student // 这样写可以告诉编译器student是一个类,在声明的时候不用导入,可以调高编译性能
    等到需要在.m文件中使用这个类所包含的方法的时候再去用import导入就可以了
     
    当两个类互相包含的时候,例如A类要用到B类,B类也要用到A类,这样如果用import导入,会报错,所以我们在声明变量的时候一般用@class去说明A是一个类,B是一个类
    只有在用到这个类的方法的时候再去用import导入
    • 如果是继承某个类,就要导入类的头文件
    • 如果只是定义成员变量、属性,用@class
     
    通常引入一个类有两种方法:一种是通过#import方式引入;
                                                   一种是通过@class引入
    两种方式的区别:
    1. #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器A.h文件中的B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
    2. 使用@class方式由于只需要知道被引用类的名称就可以了,而在实现类由于要用到被引用类中得实体变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件
    3. 如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这中问题了
  • 相关阅读:
    软件开发 [CJOJ 1101] [NOIP 模拟]
    OI中卡常数技巧
    疫情控制 [NOIP2012]
    开车旅行 [NOIP 2012]
    观光公交 [NOIP 2011] [思维推导]
    选择客栈 [NOIP 2011]
    2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II
    2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II
    2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I
    2016级算法期末上机-C.简单·Bamboo's Fight with DDLs III
  • 原文地址:https://www.cnblogs.com/hqzxbb/p/4383755.html
Copyright © 2011-2022 走看看