博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三.Object-C 方法,封装 (下)
阅读量:6850 次
发布时间:2019-06-26

本文共 2716 字,大约阅读时间需要 9 分钟。

  hot3.png

通过上面的例子可以看出:将某个属性进行私有化,并且提供外部接口的即为封装。而通过上面的延伸我们同样可以将方法进行封装。

如果一个方法没有在.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;}@end

2.同时重写set和get方法时,系统将会无法识别_name变量,这时候需要显示的设置 @synthesize name = _name,来告诉编译器,我用_name来代替name的工作。

 

 

 

 

转载于:https://my.oschina.net/MrP/blog/746422

你可能感兴趣的文章