• OC语言-04-OC语言-核心语法


    一、点语法

    1> 基本使用

    • 点语法本质上是set方法/get方法的调用

    2> 使用注意

    • 若出现在赋值操作符的右边,在执行时会转换成get方法
    • 若出现在赋值操作符的左边,在执行时会转换成set方法
    • 不能在set、get方法中用self使用点语法,会造成死循环

    二、property和synthesize关键字

    1> @property

    1. 作用

      ① 自动生成某个成员变量的set方法和get方法
    2. 使用注意

      ① 只能出现在@interface中
      ② 可以使用逗号运算符为多个同类型的成员变量生成setter和getter
      ③ 为了与点语法匹配,使用@property的成员变量不要以下划线开头
      ④ @property可以同时完成@synthesize的任务
      ⑤ @property默认生成的成员变量是@private类型的以下划线开头

    2> @synthesize

    1. 作用

      ① 自动生成某成员变量的setter和getter的实现
      ② 可以指定要访问的成员变量的名字,通常是以下划线开头
    2. 使用注意

      ① 只能出现在@implimentation中
      ② 可以使用都好运算符同时生成多个setter和getter的实现
      ③ 若未指定要访问的成员变量,默认会访问生成@synthesize后名字一
        样的成员变量
      ④ 若访问的成员变量未找到,将会自动生成@private类型的以下划线
        开头(或与@synthesize后名字一样的)的成员变量 

    三、id类型

    1> 基本含义

    • 万能指针,可以指向任何OC对象
    • 可以理解为NSObject *

    2> 使用注意

    • id在定义变量时不要加上符号*,其本身已经包含

    四、构造方法

    1> 作用

    • 用来初始化对象,返回一个初始化好的对象

    2> 关于+new方法

    1. +new等价于+alloc方法和-init方法
    2. +alloc方法和-init方法

      ① +alloc方法
      	1)返回值为id类型
      	2)为对象分配内存空间,并返回该对象
      ② -init方法
      	1)返回值为id类型
      	2)初始化当前对象,并返回初始化好的对象

    3> 重写-init方法的步骤

    1. 调用super的-init方法

      ① 初始化父类中的成员变量和其他属性
      ② 返回当前对象,并赋值给self
      ③ 根类将isa指针初始化为最初调用init方法的类
    2. 进行子类成员变量的初始化
    3. 返回初始化完毕的对象

    4> 自定义-init方法

    1. 适用场合

      ① 当初始化成员变量时,需要将成员变量初始化不同的值,通常需要自
      定义-init方法,将指定的值作为-init方法的参数
    2. 规范

      ① 一定是对象方法,以-开头
      ② 返回值一定是id类型
      ③ 方法名一定以init开头

    五、分类(category)

    1> 作用

    • 在不改变原来类的基础上为类扩充一些方法
    • 通常作用与大型的类,将类的不同类型的方法,写在不同的分类中

    2> 定义

    • 分类的定义与类的定义相似,在类名后面用小括号指明分类的名字
    • 分类通常以模块命名

    3> 使用注意

    • 分类只能为类扩充方法,不能扩充成员变量
    • 分类方法的实现中可以访问原来类中的成员变量
    • 在分类中实现原来类的方法,会造成原来类中方法的实现失效
    • 调用方法时,优先在分类中查找,然后在原来类中查找,最后才在父类中查找
    • 在原来类的多个分类查找方法时,优先在最后编译的分类中查找

    六、NSString类

    1> NSString *与char *

    1. NSString *

      NSString *指向OC字符串对象的指针
      ② NSString是OC字符串类封装了字符串相关操作的方法
    2. char *

      char *创建的是指向C语言字符或字符串的指针
      ② char *只能存储字符指针或字符串指针,没有相关操作

    2> NSString与NSMutableString

    • NSString创建的字符串对象是不可改变的,NSMutableString创建的字符串对象是可改变的

    3> NSString的方法

    1. NSString的子类必须实现的两个方法

      ① -length 对象方法,获取字符串的长度
      ② -characterAtIndex: 对象方法,获取字符串指定索引位置的字符
    2. 初始化方法

      ① +(NSString*)stringWithString: 类方法,创建一个字符串常量,在
        Xcode6.0中已经没有该方法,用字符串常量直接创建
      ② +(NSString*)stringWithFormat: 类方法,合成一个新的字符串
      ③ -(NSString*)initWithString: 对象方法,在字符串对象初始化时,为
      其赋值一个字符串常量
      ④ -(NSString*)initWithFormat: 对象方法,在字符串对象初始化时,为
      其赋值一个新合成的字符串
    3. 读取文件中字符串的方法

      +(NSString*)stringWithContentsOfFile: encoding: error: 类方法
    4. 获取网络中字符串的方法

      +(NSString*)stringWithContentsOfURL: encoding: error: 类方法
    5. 字符串操作的方法

      ① 获取字符串指定范围的子串
      	-(NSString *)substringWithRange: 对象方法,NSRange是结构体
      	类型,返回子串
      ② 将字符串中指定范围内的子串替换为指定的字符串
      	-(NSString *)stringByReplacingCharactersInRange: withString:
      	对象方法,返回行的字符串
      ③ 求子串在母串中的范围
      	-(NSRange)rangeOfString: 对象方法,返回NSRange类型
      ④ 比较两个字符串内容是否相同
      	-(BOOL)isEqualToString:(NSString *)aString 对象方法,返回BOOL
      	类型
      ⑤ 比较两个字符串的大小
      	-(NSComparisonResult)compare:(NSString *)aString 对象方法,
      	返回NSComparisonResult枚举类型
      ⑥ 用指定的字符串分割字符串
      	-(NSArray *)componentsSeparatedByString:(NSString *)separator
      	对象方法,返回NSArray数组类型指针

    七、description方法

    1> 基本使用

    • ,会调用相应的description方法
    • 可以重写description方法,使其能够通过类/对象名输出期望的信息

    2> +description与-description

    1. +description方法

      ① 类方法,默认输出格式为:类名
      ② 返回值为NSString *类型
    2. -description方法

      ① 对象方法,默认输出格式为<类名:内存地址>
      ② 返回值为NSString *类型
      ③ 不要在-description方法中用NSLog函数一%@格式输出self

    八、SEL类型

    1> 基本使用

    1. 含义

      ① SEL本质上是一个指针类型的数据
      ② 保存的是方法的地址
    2. 作用

      ① 将方法包装成SEL类型的数据
      ② 每个对应一个唯一的SEL类型数据
      ③ 通过SEL类型的数据可以间接调用类/对象方法

    2> 通过SEL类型间接调用方法的方式

    1. 通过方法名间接调用

      @selector(方法名),返回一个与参数对应的SEL类型的数据
      ② performSelector:(SEL),通过SEL类型的数据间接的调用类/对象方
        法
      ③ performSelector:(SEL) WithObject:(id),通过SEL类型数据调用含
        参数的类/对象方法
    2. 通过字符串形式的方法名间接调用

      NSSelectorFromString: 将字符串类型的方法名转换成该方法对应的
        SEL类型的数据
      ② NSStringFromSelector: 将SEL类型的数据转换成字符串类型的方法
        名
      ③ 通过转化得到到SEL类型数据,再间接调用方法

    3> _cmd的使用

    • _cmd代表当前方法对应的SEL类型数据
    • 不能在方法中通过_cmd间接调用方法,会引发死循环

    九、示例

    /*
     1.创建一个Person类,属性:name;
     2.自定义init方法,在初始化是制定每个Person对象的name
     3.为Person类添加一个包含运动方法的分类,名字为Sports
     4.重写-description方法,使其输出Person对象时,输出该对象的name属性
     5.通过SEL间接调用方法
     */
    
    #import <Foundation/Foundation.h>
    
    
    /*****定义Person类*****/
    @interface Person : NSObject
    //用@propert声明成员变量,且省略@synthesize
    @property NSString *name;
    /*自定义构造方法,在Person对象被初始化时
    给成员变量name赋予制定的值*/
    - (id)initWithName:(NSString *)name;
    //判断两个人的名字是否相同
    - (void)isSameName:(Person *)p;
    @end
    /***Person类的实现***/
    @implementation Person
    - (NSString *)description
    {
        return self.name;
    }
    - (id)initWithName:(NSString *)name
    {
        self.name = name;
        return self;
    }
    - (void)isSameName:(Person *)p
    {
        /*调用NSString的对象方法isEqualToString
        判断两个人的名字是否相同*/
        if ([self.name isEqualToString:p.name])
        {
            NSLog(@"
    这两个人的名字都为:%@", self);
        }
        //通过重写的description方法通过对象名输出该对象的属性
        NSLog(@"
    这两个人的名字分别为:%@	%@", self, p);
    }
    @end
    
    
    /****为Person类增加一个分类****/
    @interface Person (Sports)
    //为Person类添加打乒乓球这个方法
    - (void)playTableTennis;
    //为Person类添加打篮球这个方法
    - (void)playBasketball;
    @end
    /**Person的分类Sports的实现**/
    @implementation Person (Sports)
    - (void)playTableTennis
    {
        NSLog(@"
    %@正在打乒乓球", self);
    }
    - (void)playBasketball
    {
        NSLog(@"
    %@正在打篮球", self);
    }
    @end
    
    
    /*****测试函数main*****/
    int main()
    {
        @autoreleasepool {
            //定义两个字符串,用于存放两个名字
            NSString *str = @"Tom";
            NSString *str2 = @"Jack";
            //定义两个Person对象,并调用重写的构造方法
            Person *p = [[Person alloc] initWithName:str];
            Person *p2 = [[Person alloc] initWithName:str2];
            //通过方法名间接调用方法
            [p performSelector:@selector(isSameName:) withObject:p2];
            //通过字符串形式的方法名间接调用方法
            [p performSelector:NSSelectorFromString(@"playBasketball")];    
        }
        return 0;
    }
  • 相关阅读:
    数学角度看设计模式之观察者模式
    XML、JSON数据结构解析
    [理解ASP.NET Core框架]一个五十行的控制台Web
    .Net Core 学习 (1)
    SqlServer windowss身份登陆和sa身份登陆
    学习51单片机——秒表分享
    C语言中函数声明实现的位置
    java DOM4J 读取XML
    服务器与Linux操作系统基础原理
    Go语言实现数据结构(一)单链表
  • 原文地址:https://www.cnblogs.com/shuxiachahu123/p/4912511.html
Copyright © 2020-2023  润新知