Objective-C基础学习笔记(三)-面向对象的三大特性之封装-set方法-get方法-类方法与对象方法

面向对象的三大特性:封装(成员变量)、继承、多态;

一、 封装

1. 封装的理解:

    在开发过程中,考虑到安全性要求,我们通常不让外界直接修改我们类的成员变量,而让外界使用我们提供的方法来修改,这样类 的成员变量就           封装起来了。

2. 封装的目的就是:保证数据的安全行,保证业务逻辑正常 运行。

二、set 方法和get 方法

@public的成员可以被随意赋值,为了封装成员变量OC中使用set方法和get方法来管理成员的访问。

 1. set方法

   1) 作用:提供一个方法给外界设置成员变量属性值,可在方法里面对一些不合理的赋值进行筛选和过滤。

   2) 命名规范

   1> 方法命名必须以set开头

   2> set后面跟上成员变量的名称。成员变量的首字母必须大写。

   3> 返回值一定是void

   4> 一定要接受一个参数,而且参数的类型一定要和成员变量的类型一致

   5>行参名称不能跟成员变量名一样,苹果官方规定成员变量的命名以 _开头

  3) set方法好处:

     1> 不让数据暴露在外,保证了数据的安全性

   2> 对设置的数据进行过滤

2. get方法

    1) get方法的作用:为调用者返回对象内部的成员变量
    2) 命名规范:
     (1)一定有返回值,返回值的类型和成员变量的类型一致
     (2)方法名和成员变量名一样
     (3)不需要接收任何参数

3.成员变量的命名规范
       ➢成员变量都以下划线 _ 开头
       ➢可以跟get方法的名称区分开
       ➢可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

4. 不一定set和get方法都会提供,如果内部的成员变量只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set 方法。

5. set方法和get方法使用示例:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject
 4 {
 5     //@public
 6     //成员变量保证安全性不要用public
 7     int _age;  // 年龄
 8     int _num; // 学号
 9 }
10 
11 /* set方法声明 */
12 - (void)setAge:(int)age;
13 
14 /* get方法声明 */
15 - (int)age;
16 @end
17 
18 @implementation Student
19 
20 /* set 方法实现 */
21 - (void)setAge:(int)age
22 {
23     // 对参数进行过滤
24     if (age <= 0)
25     {
26         age = 1;
27     }
28     _age = age;
29 
30 }
31 /* get 方法实现 */
32 - (int)age
33 {
34     // 返回成员变量的值
35     return _age;
36 }
37 @end
38 
39 int main()
40 {
41     Student *stu = [Student new];
42     [stu setAge:-12];
43     NSLog(@"学生的年龄是%d岁",[stu age]);
44     return 0;
45 }

运行结果:

2015-03-16 22:44:39.247 a.out[1798:164370] 学生的年龄是1岁

三、方法与函数的区别

  1) OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

  2) C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

  3) C函数不能访问OC对象的成员

四、类方法与对象方法

  1.  方法名注意

     >  冒号也是方法名的一部分

     >  同一个类中不允许两个对象方法同名

  2.  方法的调用

     OC中执行一些行为就加[]具体如下:

[stu setAge:-12]; //调用 stu 对象的setAage方法并传入了参数-12 ,实际意义是向stu 这个对象发送了一个消息

3. OC中的两种方法:类方法和对象方法

什么是类方法:直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类对象方法的列表

什么是对象方法:直接可以用对象来执行的方法(

1) 对象方法
以减号-开头
只能由对象调用,没有对象,这个方法根本不可能被执行
对象方法能访问实例变量(成员变量)

2) 类方法
以加号+开头
只能用类名调用,对象不能调用,不用创建对象
类方法中不能访问实例变量(成员变量)
使用场合:
当方法内部不需要使用到成员变量时,就可以改为类方法,一般没有成员的变量的类(工具类:没有任何成员变量,里面的方法都是类方法,如计算器)

3)类方法和对象方法可以同名,对象方法中能够调用类方法,类方法中也可以调用对象方法 

4)  类方法使用的好处:

      不依赖对象,执行效率高,能用类方法就尽量用类方法

5)类方法使用陷阱--小心死循环  

1 +(void)test
2 {
3      [person test];
4 }

4. 类方法与对象方法示例

#import <Foundation/Foundation.h>

@interface Person : NSObject

//类方法都是以+开头
+ (void)printClassName;
//对象方法都是以-开头
- (void)test;
@end

@implementation Person

/* 类方法实现 */
+ (void)printClassName
{
    NSLog(@"Person");
}
/* 对象方法实现 */
- (void)test
{
    NSLog(@"This is test function");
}
@end

int main()
{
    //运行时类加载到内存,里面有方法列表,直接去 类列表地址中找加号开头的方法
    //不用创建对象
    [Person printClassName];

    Person *p = [Person new];
    // 对象方法调用
    [p test];

    return 0;
}