我的iOS开发之Objective-C第2天之面向对象特性之封装

来源:互联网 发布:js鼠标移上去图片放大 编辑:程序博客网 时间:2024/04/29 19:03

1、封装的定义:
即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。


举一个例子吧
Student.h
声明类,我们通常放到.h的头文件中
声明类使用关键字 @interface

#import <Foundation/Foundation.h>@interface Student : NSObject{    //@private 私有成员,只有当前类可以访问;    //@protected 受保护成员,只有当前类或子类可以访问(如    //果没有添加任何修饰则默认为@protected);    //@public 公共成员,所有类均可访问;    //实例变量    @public    NSString *name;    int age;}//实例方法(减号方法)-(void)sayHi;//类方法(加号方法)+(void)sayHi;@end

Student.m
实现一个类 使用关键字:@implementation
实现一个类通常放到.m的文件中
实现类主要是对方法的具体实现

#import "Student.h"@implementation Student//方法的实现-(void)sayHi{    NSLog(@"我叫%@ 今年%d岁 ",_name,_age);}+(void)sayHi{    NSLog(@"我是一名学生");}@end

main.m

#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]) {    @autoreleasepool {    //通过new或者alloc init创建一个对象        Student *stu=[Student new];        Student *stu1=[[Student alloc] init];        //对public实现变量,可以直接访问进行修改        //对于protected以及private访问可用setter,getter方法,后面细说        stu->_age=22;        stu->_name=@"lvdonghui";        //方法的调用        [Student sayHi];        [stu sayHi];    }    return 0;}

运行结果
2015-08-12 09:49:07.073 St[752:39725] 我是一名学生
2015-08-12 09:49:07.075 St[752:39725] 我叫lvdonghui 今年22岁


2、setter,getter方法
方法的声明

-(void) setName:(NSString *) name;-( NSString *) name;

方法的实现

-(void)setName:(NSString *)name{    _name=name;}-(NSString * )name{    return _name;}

在main.m中使用

  Student *stu=[Student new];      //调用方法访问实例变量        [stu setName:@"吕冬辉"];        NSLog(@"%@",[stu name]);

也可以使用点语法

 stu.name=@"吕冬辉";        NSLog(@"%@",stu.name);

2、对象的存储细节
上面的例子中stu就是对象,Student就是类
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成 员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份 存储空间,类的方法存储于此。
这里写图片描述

3、初始化方法

  1. 便利初始化
-(Student *)initWithName:(NSString *)name Age:(int)age{    if (self = [super init]) {        self.name=name;        _age=age;    }    return self;}
  1. 便利构造器
+(Student *)studentWithName:(NSString *)name Age:(int)age{    return  [[Student alloc] initWithName:name Age:age];}

3main.m中运用

Student *stu=[Student  studentWithName:@"吕冬辉" Age:22];        [stu sayHi];

结果:

2015-08-12 13:06:21.527 St[952:70940] 我叫吕冬辉 今年22岁
0 0