学习目标

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文件

#import

@interface Person : NSObject

{

NSString *_name;

}

- (void)sayHi;

@end

//Person.m文件

#import "Person.h"

@implementation Person

- (void)sayHi{

NSLog(@"这是对象方法");

}

@end

//main.m文件

#import

#import "Person.h"

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

@autoreleasepool {

//给匿名对象的实例变量赋值,不过匿名对象只能访问一次,赋值后就不能再使用了

[Person new] -> name = @"jack";

//调用匿名对象的对象方法,调用完了就不再用这个对象了

[[Person new] sayHi];

}

return 0;

}

五、封装实例变量

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


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

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

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


为类提供一种专门为实例变量赋值的方法 setter

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

2.这个方法一定没有返回值,为实例变量赋值不需要返回值。

3.这个方法一定是有参数的,为实例变量赋值一定需要传入一个和实例变量类型相同的参数。

4.这个方法的方法名以set开头,后面跟实例变量名去掉下划线,并首字母大写。


为类提供一种专门访问实例变量的值的方法 getter

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

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

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

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

//Person.h文件

#import

@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

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

六、对象之间的关系


组合关系

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


依赖关系

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


关联关系

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


面向对象设计中:


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


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


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

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

(整理于网上)

017-封装-OC笔记的更多相关文章

  1. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  2. 016-类与对象-OC笔记

    学习目标 1.[理解]对象在内存中的存储 2.[理解]nil和NULL 3.[了解]#pragma mark分组导航标记 4.[理解]方法与函数 5.[掌握]多文件开发 6.[掌握]对象和方法 7.[ ...

  3. 015-OC基础语法-OC笔记

    学习目标 1.[了解]Objective-C语言简介 2.[掌握]第一个OC程序 3.[掌握]OC中的字符串 4.[熟悉]OC中的一些玩意 5.[了解]面向过程与面向对象 6.[掌握]类的声明和实现 ...

  4. OC笔记一:Objective-C简介

    1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...

  5. [OC笔记] protocol之我的见解

    OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的.这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者. 让委托者去执行响应的 ...

  6. [OC笔记] Category分类之见解

    用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类.但是OC里面有更好的方法,那就是分类. 那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作 ...

  7. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  8. [OC笔记]我的第一个OC程序

    这是我第一个OC程序,详情都写在了注释里面,讲的是Student和Book这两个类的创建和使用.(是不是觉得student这个类在各种语言入门代码里经常出现呢?真实有爱) 看完这些,你会发现,咱们其实 ...

  9. Ajax封装函数笔记

    Ajax封装函数: function ajax(method, url, data, success) { //打开浏览器 //1.创建一个ajax对象 var xhr = null; try { x ...

随机推荐

  1. Spring完全基于Java配置和集成Junit单元测试

    要点: 配置继承WebApplicationInitializer的类作为启动类,相当于配置web.xml文件 使用@Configuration注解一个类,在类中的方式使用@Bean注解,则表名该方法 ...

  2. JS——2048(支持触屏及键盘操作)

    <html> <head> <title>2048</title> <style type="text/css"> ta ...

  3. Dynamics CRM2016 关于修改部署管理员账号权限引发的问题

    最近在用2016做项目,一个同事的一个操作给我带来了一个头疼的问题,他把部署管理员的CRM账号的管理员权限给移除了,导致整个系统的所有账号进CRM都是下图这样 即使系统中还存在其他的拥有管理员权限的账 ...

  4. Java异常处理-----自行处理

    自行处理 1.try{//可能发生异常的代码 }catch(异常类 变量名){//处理}. 2.案例除法运算的异常处理. 3.如果没有进行try catch处理,出现异常程序就停止.进行处理后,程序会 ...

  5. Swift中方法闭包参数不能省略括号的一种情况

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在swift中,如果方法的最后一个参数是一个闭包类型, ...

  6. Erlang递归列举目录下文件

    Erlang递归列举目录下文件(金庆的专栏)%%%-------------------------------------------------------------------%%% @aut ...

  7. gradle2.0笔记——让项目升级到gradle2.0

    昨晚看到QQ群消息说gradle2.0发布了,今天去看了一下,确实是昨天发布的,为rc版本:Gradle 2.0-rc-2.于是决定试一下. gradle可以在官网上下载,地址如下:http://ww ...

  8. Linux下多线程编程遇到的一些问题

    今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...

  9. 成员函数的const到底修饰的是谁

    demo <pre name="code" class="cpp">class Test { public: const void OpVar(in ...

  10. Java项目源码为什么要做代码混淆(解释的很好)

    代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码.执行代码混淆的程序被称作代码混淆器.目前已经存在许多种 ...