OC:封装(一)☀️

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。

学习目标

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`方法。

###六、对象之间的关系

######组合关系

>一个类是由多个对象组合而成的(多个对象都是同一个类的实例变量),那么他们之间的关系就叫组合关系。

######依赖关系

>一个方法的参数是另一个对象(依赖参数那个对象,没有了参数就无法整了),那么他们之间的关系就是依赖关系。

######关联关系

>当一个对象拥有另外一个对象的时候(一个对象是另一个对象的实例变量,但是他们并不是组合关系),那么他们之间的关系就是关联关系。

######面向对象设计中:

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,231评论 0 2
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,481评论 0 1
  • 似乎有越来越多的文章,开始教大家写作。怎样搭建框架,怎样布局情节,怎样迎合读者的口味......看起来套路满满,但...
    之颜阅读 317评论 4 4
  • 今天是第一期“聚正气卫梦想”培训启动,来的时候就在想,是一种什么形式的培训方式。能不能通过培训突破一下我自己...
    海尔大连张乘铭阅读 439评论 0 0
  • 一位前辈知道我学佛,发了一篇易中天的文章给我,让我好好看看,说人生一世根本没有什么前生来世,更没有什么六道轮回。还...
    原疯不动阅读 338评论 7 7