美文网首页
OC 基本语法(1)

OC 基本语法(1)

作者: 风之化身呀 | 来源:发表于2018-11-08 00:07 被阅读14次

    1、类

    • 声明
      1、类名的第一个字母必须是大写;
      2、不能有下划线;
      3、多个英文单词用驼峰标识;
      4、实例方法以减号 - 开头,类方法以+开头;
      5、 OC方法中任何数据类型都必须要用()扩住,OC方法中的小括号():只有一个作用,用来扩住数据类型
      6、声明在@interface和@end之间进行;
    #import <Foundation/Foundation.h> // 因为使用了NSObject
    @interface Car : NSObject    // NSObject目的是:让Car这个类具备创建对象的能力
    {
        @public  // @public关键字,可以让外部的指针间接访问内部的成员变量   
        int wheels; // 轮胎个数  
        int speed; // 时速 xxkm/h    
        // 大括号里面只能写属性不能写行为
    }
    - (void)run;  // 定义实例方法
    + (void)runWith:(NSString *) p1 andWith:(NSString *)p2 // 定义对象方法
    @end
    
    • 实现
      实现在@implementation和@end之间进行
    @implementation Car
    - (void)run
    {
        NSLog(@"车子跑起来了!");  // 实现声明的方法
    }
    @end
    

    2、点语法和id指针

    1、点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。
    2、切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
    3、避免死循环,避免这种写法:
    (1)在set方法中,self.age=age;相当于是[self setAge:age];
    (2)在get方法中,return self.age;相当于是[self age];
    4、id是万能指针,能指向或者说操作任何OC对象 。注意:id后面不要加上 *

    3、一些关键字

    @property 和 @synthesize

    1、@property 关键字可以自动生成某个成员变量的setter和getter方法的声明;
    2、@synthesize关键字可以帮助生成成员变量的setter和getter方法的实现。

    @property int age;
    // 编译时遇到这一行,则自动扩展成下面两句:
    - (void)setAge:(int)age;
    - (int)age;
    // 语法:
    @synthesize age = _age;
    // 相当于下面的代码:
    - (void)setAge:(int)age
    {
      _age = age;
    }
    
    - (int)age
    {
      return  _age;
    }
    

    3、若手动实现了setter方法,编译器就只会自动生成getter方法和不存在的成员变量;
      若手动实现了getter方法,编译器就只会自动生成setter方法和不存在的成员变量;
    若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量;
    4、自从Xcode4.4后,@property就独揽了@synthesize的功能,也就是说,@property可以同时生成setter和getter的声明和实现
      默认情况下,setter和getter方法中的实现,会去访问下划线_ 开头的成员变量。
    5、@property 参数

    1. 内存管理相关的参数
    • retain:release旧值,retain新值(适用于OC对象类型),引用地址复制
    • assign:直接赋值(默认的,适用于非OC对象类型),也就是基本数据类型的赋值默认有个assign参数
    • copy:release旧值,copy新值,值复制
    1. 是否要生成set方法
    • readwrite:同时生成setter和getter的声明跟实现
    • readonly:只会生成getter的声明跟实现
    1. 多线程管理
    • nonatomic:性能高(一般就用这个)
    • atomic:性能低(默认)
    1. setter和getter方法的名称
    • setter:决定了set方法的名称,一定要有个冒号:
    • getter:决定了get方法的名称(一般用在BOOL类型的get方法)

    @protocal(TS中的抽象类)

    1、可以用来声明一大堆方法(不能声明成员变量)
    2、只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
    3、只要父类遵守了某个协议,就相当于子类也遵守了
    4、定义协议:

    @protocol 协议名称 <NSObject>  //遵守基协议
    
      // 方法声明列表....
    
     @end
    

    5、遵守协议

    @interface 类名 : 父类名 <协议名称1, 协议名称2>
    
     @end
    

    instancetype

    使那些非关联返回类型的方法返回所在类的类型,就是规定方法的返回值,有点类似链式调用

    @interface NSArray
    +(id)constructAnArray;
    @end
    [NSArray constructAnArray]  // 返回类型是 id
    
    @interface NSArray
    +(instancetype)constructAnArray;
    @end
    [NSArray constructAnArray]  // 返回类型是 NSArray
    

    4、分类(前端里的装饰器)

    1、可以给某一个类扩充一些方法(不修改原来类的代码)
    2、语法:

    // 声明
    @interface 类名(分类名称)
    
    @end
    
    // 实现
    
    @implementation 类名(分类名称)
    
    @end
    

    相关文章

      网友评论

          本文标题:OC 基本语法(1)

          本文链接:https://www.haomeiwen.com/subject/nwdbxqtx.html