通过上面的例子可以看出:将某个属性进行私有化,并且提供外部接口的即为封装。而通过上面的延伸我们同样可以将方法进行封装。
如果一个方法没有在.h文件中声明,而在.m文件中实现,那么这种就是私有化方法。
私有化方法无法被外部访问。可以被内部方法访问。我们要想获取私有化方法的值,我们可以用公共方法调用私有化方法,形成间接访问。
self关键字
self 可以代表实例,也可以代表类。
self 意思是 指向当前调用的实例或类。
-
属性和self的运用
当一个属性拥有了set或者get方法,或者只有其中一个,都可以用self.xx 来快速调用set或者get方法。
-
self和方法的运用
@implementation People- (void)displayA{ //实例方法可以直接调用实例方法 [self displayA]; //当前的self指向的是People的实例 //实例方法调用静态方法需要用到类名调用 [People showInfoA];}- (void)displayB{ [self displayB];}+ (void)showInfoA{ // 静态方法可以直接调用静态方法 [self showInfoA]; //当前的self指向的是People类 //静态方法调用实例方法需要实例化 People *peo = [[People alloc]init]; [peo displayA];}+ (void)showInfoB{ [self showInfoB];}@end
在这里,方法和self有个特殊的地方,如下:
同理,name方法也会出现同样的情况,所以,在设计属性变量的时候需要为 属性前面加上下划线便于区分开和参数名称相同的情况。
property关键字
property 会声明一个私有化成员属性,并且会为这个属性提供set和get方法。且有多种控制模式,包括线程加锁权限的控制,只读和可写的控制,还有对于内存管理的控制。(这里对于property不会涉及太深,只做简单介绍,详情请看内存管理篇)
property实现的几种方法
1.直接进行变量声明
当前模式下 默认是为(atomic,readwrite,assign)
int age;
2.显示设置它的控制权限
(nonatomic,readwrite,copy)NSString *otherName;
(nonatomic,readonly,assign)int otherAge;
(nonatomic,readwrite,strong)Son *son;
这里我们先介绍几个关键字:
readonly: 生成get方法
readwrite:生成set和get方法
copy: 可用于字符串,创建一个新的对象,将原有对象内容复制到新对象中。简单理解就是产生一个副本,原有文件消失不会影响这个副本,而副本消失也不会影响原有文件。
strong:在原有类的基础上进行改动。
assign:针对基本数据类型,单纯的进行赋值,不会牵涉到内存方面的问题。
使用策略:
copy:只用于NSString\block
strong: 除NSString\block以外的OC对象
assign:基本数据类型,枚举,结构体
property的使用:
#import "Son.h"@interface People : NSObject{ NSString *_name; int _age;}//1.直接进行变量声明当前模式下 默认是为(atomic,readwrite,assign)@property int age;@property (nonatomic,readwrite,copy)NSString *otherName;@property (nonatomic,readonly,assign)int otherAge;@property (nonatomic,readwrite,strong)Son *son;- (void)display;@end#import "People.h"@implementation People- (void)display{ /*通过property声明的属性,可自动生成set/get方法 不要主动的去定义和实现set/get方法 这里调用的是 setOtherName方法*/ self.otherName = @"property属性"; //这里调用的是 otherName方法 NSLog(@"otherName:%@",self.otherName);}@end@synthesize 关键字
在早期的时候,property值负责声明set/get方法,而synthesize负责实现set/get方法。但现在省略了synthesize的功能,由property负责声明和实现了。现在synthesize 负责在property属性名称和非property成员属性名称相同的情况下,区分开两者.
通过上面的代码,我们可以看到通过synthesize name = _name; 这种方式,告诉编译器,property将会采用 _name的名称,这样就会和同名的非property的成员属性区分开来。
重写set/get方法时的注意点:
在没有重写set/get方法的时候或者 显示 使用 @synthesize name = _name的时候,property 会自动为属性设置一个_ name,来区分开,set方法的参数同名问题。但是有几个问题需要注意的是:
1.只重写set方法或者get方法,时候可以正常使用_name
@interface People : NSObject@property (nonatomic,readwrite,copy)NSString *name;@end@implementation People- (void)setName:(NSString *)name{ _nameame = name;}@end2.同时重写set和get方法时,系统将会无法识别_name变量,这时候需要显示的设置 @synthesize name = _name,来告诉编译器,我用_name来代替name的工作。