封装:
——–对于新手来说,封装听起来是不是就好像打包的意思呢?的确,当初我刚刚接触面向对象语言的时候,记得第一次听到封装一词,我就在琢磨,封装?好像都是一些货物需要打包装箱,这代码为什么要封装呢,当时就懵了!不过还好,由于老师耐心的讲解,终于化开了我的疑虑,哈哈。
封装:
是把过程和数据包围起来,对数据的访问只能通过已定义的接口。当然还不止这些,封装主要是使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。说白了不就是,咱怕家里小孩儿瞎捣鼓电脑,然后咱把该保护的文件给隐藏起来了呗!
封装的使用:
其实使用封装最主要的标志就是,咱们使用了setter和getter这哥俩,他俩同时使用就是对数据的封装,当然在OC中还有更加简洁的封装方式,下面列出。
#import <Foundation/Foundation.h>
@interface Package : NSObject
{
NSString *name;
int age;
}
- (void)setName : (NSString *)NewName;
- (NSString *)name;
- (void)setAge : (int)NewAge;
- (int)age;
@end
@implementation Package
- (void)setName : (NSString *)NewName{
name = NewName;
}
- (NSString *)name{
return name;
}
- (void)setAge : (int)NewAge{
age = NewAge;
}
- (int)age{
return age;
}
@end
int main(int argc, const char * argv[]) {
Package *p = [[Package alloc]init];
[p setName:@"liming"];
[p setAge:22];
NSLog(@"name is:%@,age is:%d",p.name,p.age);
return 0;
}
**重点内容**
setter和getter方法介绍完了,接下来就介绍一下,下一对兄弟!@property和@synthesize
(1)@property:
自动生成某个成员变量的setter,getter方法声明。在@interface中使用:
#import <Foundation/Foundation.h>
@interface PackageDemo : NSObject
{
NSString *name;
int age;
}
@property NSString *name;
@property int age;
@end
(2)@synthesize
自动生成由@property生成的setter,getter方法的实现,并且访问相应的成员变量。
@implementation PackageDemo
@synthesize name;
@synthesize age;
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
PackageDemo *p = [[PackageDemo alloc]init];
[p setName:@"liming"];
[p setAge:22];
NSLog(@"the name is:%@,age is:%d",p.name,p.age);
}
return 0;
}
天,有木有这跟上面使用set和get那哥俩的时候比较起来省事多了!
使用@synthesize即可完成前面对setter,getter方法的实现。@property,@synthesize是通过编译器完成的.
有必要说说getter和setter 的调用方法和点( . )调用方法
1.一般的调用方法,是传统的中括号[]的调用方法,比如
//比如上面的PackageDemo类
PackageDemo *p = [[PackageDemo alloc]init];
[p setName:@"liming"];
[p setAge:30];
2.点语法(可以用来替代传统的中括号[]方式)
PackageDemo *p = [[PackageDemo alloc]init]
p.name = @"liming"
//[p setName:@"liming"]
p.age = 22
//[p setAge:22]
NSLog(@"the name is:%@,age is:%d",p.name,p.age)
由上面的示例中可以轻易的看出点( . )语法的用法,即把原来的[p setName:@”liming”]换成了p.name = 10了,而且他们俩可完全等价,用起来就是这么 so easy!当然了,这里还是会存在一些误区的,误区就在于,他俩完全等价,可不要以为p.name是直接访问p对象的成员变量namel了,而是由咱们的编译器在遇到p.name = @”liming”的时候自动将这行代码变化成了[p setName:@”liming”]进行编译了,可不要误会哦!