美文网首页iOS技术文章
OC:封装(一)☀️

OC:封装(一)☀️

作者: LeaderBiao | 来源:发表于2016-06-23 23:20 被阅读40次
    • 版权声明:本文为博主原创文章,未经博主允许不得转载。

    学习目标

    1.【了解】异常处理

    2.【掌握】类方法

    3.【掌握】NSString类

    4.【掌握】匿名对象

    5.【掌握】封装实例变量

    6.【掌握】对象之间的关系

    一、异常处理

    什么是异常?
    代码完全符合语法规范,可以编译、链接、执行,但是在程序运行的时候,当程序处于某种特定情况下的时候,程序运行就会出错,像这样的情况就叫做程序发生了异常。
    一旦发生异常,程序会立即奔溃。为了避免程序在发生异常的时候奔溃,OC提供了@try @catch异常处理。```
    
    >异常处理语法:
    
    

    @try {
    //可能发生异常的代码
    }

    @catch (NSException *指针名) {
    //发生异常后执行的代码
    }

    @finally {
    //无论有没有发生异常,都会执行的代码
    }```

    执行步骤:

    第一种情况:先执行@try中的代码,如果这里面的代码发生了异常,系统就会把异常信息存储到@catch中的指针变量,然后执行@catch中的代码。@catch中的代码执行完毕后,还会执行@finally中的代码(@finally是可选的)。

    第二种情况:先执行@try中的代码,如果@try中的代码不发生异常,@catch中的代码不会执行。但还是会执行@finally中的代码(@finally是可选的)。所以,@catch中的代码只有在@try中的代码发生异常的时候才会执行

    注意:
    1.@try-@catch只能处理OC中的异常(跟类和对象有关的)。
    
    2.写代码过程中尽力使用if来判断,避免异常。
    
    3.@finally不是必须写的语句,可以没有@finally。```
    
    ###二、类方法
    
    
    >OC中的方法分为两种,对象方法(实例方法)和类方法(静态方法)。
    
    >对象方法:依赖于对象,对象方法必须创建对象,通过对象名来调用。
    
    >类方法:不依赖与对象,类方法不需要创建对象,通过类名来调用。
    
    >声明语法:+ (返回值类型)方法名;
    
    

    //声明类方法
    @interface Person : NSObject

    • (void)test;
      @end

    //实现类方法
    @implementation Person

    • (void)test{
      NSLog(@"this is a class method!");
      }
      @end

    //主函数里调用类方法
    [Person test];```

    注意:

    1.对象方法和类方法的方法名可以同名,两个方法互不影响。

    2.类方法调用不需要创建对象,从效率上而言会更快一些。

    3.对象方法只能通过对象名来调用,类方法只能通过类名来调用。

    4.对象方法中可以直接访问实例变量和类方法,类方法中不能直接访问实例变量和对象方法。

    5.如果方法不需要访问对象的实例变量的时候,我们可以将其定义为类方法,提高效率。

    类方法的规范

    //提供一个和类同名的类方法来创建一个对象。比如:
    
    + (Person *)person;//声明类方法
    
    //实现类方法
    + (Person *)person
    {
        Person *person = [Person new];//创建对象person
    
        return person;//返回对象person
    }```
    
    

    //提供一个类方法创建对象,并让调用者可以初始化新创建对象的实例变量的值。比如:

    • (Person *)personWithName:(NSString *)name;//声明类方法

    //实现类方法

    • (Person *)personWithName:(NSString *)name
      {
      Person *person = [Person new];//创建对象person

      person -> _name = name;//将调用者传递进来的参数赋值给person对象的实例变量

      return person;//返回对象person
      }```

    三、NSString类

    OC中提供了一个字符串类NSString,以对象的形式存储字符串。

    - NSString类的常用方法
    
    //stringWithCString:将C语言字符串转化为OC字符串。
    
    NSString *str = [NSString stringWithCString:"C字符串"];
    
    
    
    //stringWithFormat:格式化字符串,也可以做多个变量、字符串的拼接。
    
    for(int i = 1;i <= 1000;i++)
    {
        NSString *str = [NSString stringWithFormat:@"d",i];
    
        NSLog(@"%@",str);
    }
    
    
    
    //length计算字符串长度,是计算字符个数,一个中文字也是1个长度。
    
    NSString *str = @"字符串abcd";
    
    NSUInteger length = [str length];//这里是长度为7
    
    
    
    //characterAtIndex:获取指定位置的字符,位置从0开始递增。
    
    NSString *str = @"字符串abcd";
    
    unichar ch = [str characterAtIndex:3];//从0开始计算
    
    NSLog(@"ch = %C",ch); //%C OC里新增的格式控符,可以输出单个中文
    
    
    //isEqualToString:比较两个字符串是否相同。
    
    NSString *str = @"字符串abcd";
    
    NSString *str1 = @"字符串abcd";
    
    BOOL res = [str isEqualToString:str1];
    
    
    
    //compare:比较两个字符串的大小(ASCII)
    
    NSString *s1 = @"China";
    
    NSString *s2 = @"Japan";
    
    int res = [s1 compare:s2];
    
    NSLog(@"res = %i",res);//s1 < s2则返回1  s1 > s2 返回-1 相等返回0```
    
    
    ###四、匿名对象
    
    
    >实例化一个对象的时候,没有用任何指针指向这个对象,这个对象就是匿名对象。并且匿名对象只能调用一次,所以如果你只是为了调用某一个对象的对象方法,就可以使用匿名对象。比如:
    
    

    //Person.h文件

    @interface Person : NSObject
    {
    NSString *_name;
    }

    • (void)sayHi;

    @end

    //Person.m文件

    import "Person.h"

    @implementation Person

    • (void)sayHi
      {
      NSLog(@"这是对象方法");
      }

    @end

    //main.m文件

    import "Person.h"

    int main(int argc, const char * argv[])
    {
    @autoreleasepool {

        //给匿名对象的实例变量赋值,不过匿名对象只能访问一次,赋值后就不能再使用了
        [Person new] -> name = @"jack";
    
        //调用匿名对象的对象方法,调用完了就不再用这个对象了
        [[Person new] sayHi];
    }
    return 0;
    

    }```

    五、封装实例变量

    一个类之中有多个属性、方法,把这些成员封装在一个类中,把这个类当做一个整体来使用。

    封装的好处:便于管理代码的维护,以类为单位来管理他们。屏蔽内部的实现,对于外部而言只是一个对象。

    为对象的属性赋值的时候,只要赋值的数据的类型和属性的类型一致就可以了。但是,这样的赋值往往都不能随意赋值。比如人的年龄为int类型,我们赋值-10语法也不会报错。但这种赋值不符合实际情况,所以我们要为属性赋值范围加以限定。

    首先,实例变量一定不能被@public修饰,因为一旦被@public修饰,就能在外界通过对象名来访问这个实例变量,随意修改实例变量的值。然后给实例变量提供两种方法来供外界为实例变量赋值和访问,也就是settergetter方法。只有getter方法没有setter方法叫只读封装,只有setter方法没有getter方法叫只写封装。

    • 为类提供一种专门为实例变量赋值的方法 setter
    1.这个方法一定是一个对象方法,因为只有对象方法才能直接访问实例变量。
    
    2.这个方法一定没有返回值,为实例变量赋值不需要返回值。
    
    3.这个方法一定是有参数的,为实例变量赋值一定需要传入一个和实例变量类型相同的参数。
    
    4.这个方法的方法名以<set>开头,后面跟实例变量名<去掉>下划线,并首字母大写。```
    
    - 为类提供一种专门访问实例变量的值的方法 `getter`
    
    

    1.这个方法一定是一个对象方法,因为只有对象方法才能直接访问实例变量。

    2.这个方法一定有返回值,供外界访问实例变量,必须要返回给调用者实例变量的值。

    3.这个方法一定没有参数,访问实例变量的值不需要传入任何参数。

    4.这个方法的方法名就是去掉下划线的实例变量的名字。```

    //Person.h文件
    
    @interface Person : NSObject
    {
        //不要给实例变量@public修饰
        int _age;
    }
    
    //setter声明
    - (void)setAge:(int)age;
    
    //getter声明
    - (int)age;
    
    @end
    
    //Person.m文件
    
    #import "Person.h"
    
    @implementation Person
    
    //setter实现
    - (void)setAge:(int)age
    {
        //传入的年龄在 0 - 120之间才能赋值,否则输出提示
    
        if(age > 0 && age < 120)
        {
          _age = age;
        }
        else
        {
            NSLog(@"年龄不符合");
        }
    }
    
    //getter实现
    - (int)age
    {
        return _age;
    }
    @end
    
    //main.m文件
    
    #import "Person.h"
    int main(int argc, const char * argv[]) 
    {
        @autoreleasepool {
    
            //实例化一个对象p
            Person *p = [Person new];
    
            //调用p对象setAge方法为对象的实例变量赋值
            [p setAge:200];//因为不符合规范,会打印出 年龄不符合
    
            //输出p对象的实例变量age的值
            NSLog(@"age = %i",[p age]);//输出 age = 0
        }
        return 0;
    }```
    
    ####注意:
    
    >1.`setter`和`getter`方法的命名必须符合规范。
    
    >2.实例变量无论如何都不能用`@public`修饰,不然就不符合封装的理念。
    
    >3.只要实例变量要被外界访问,都应该为他封装一个`setter`和`getter`方法。
    
    ###六、对象之间的关系
    
    ######组合关系
    
    >一个类是由多个对象组合而成的(多个对象都是同一个类的实例变量),那么他们之间的关系就叫组合关系。
    
    ######依赖关系
    
    >一个方法的参数是另一个对象(依赖参数那个对象,没有了参数就无法整了),那么他们之间的关系就是依赖关系。
    
    ######关联关系
    
    >当一个对象拥有另外一个对象的时候(一个对象是另一个对象的实例变量,但是他们并不是组合关系),那么他们之间的关系就是关联关系。
    
    ######面向对象设计中:
    
    

    耦合度 当修改一个对象的时候,对另外一个对象的影响程度

    低耦合 当修改一个对象的对其他对象影响比较小

    高内聚 一个对象仅仅做自己相关的事情

    面向对象设计原则是高内聚、低耦合,单一职责原则。```

    相关文章

      网友评论

        本文标题:OC:封装(一)☀️

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