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、初始化方法
- 便利初始化
-(Student *)initWithName:(NSString *)name Age:(int)age{
if (self = [super init]) {
self.name=name;
_age=age;
}
return self;
}
- 便利构造器
+(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岁