当前位置:网站首页>【Objective-C语言中的@property增强】
【Objective-C语言中的@property增强】
2022-08-03 01:41:00 【清风清晨】
前言
什么是@property增强?
Xcode4.4之前的写法:
1)@property只是生成了getter和setter的声明;
@synthesize只是生成了getter和setter的实现;
属性还得自己写;
这种写法是Xcode4.4之前的写法,Xcode4.4之后,Xcode对@property做了1个增强
一、@property增强了什么?
Xcode4.4之后,你只要写一个@property,它就会:
1)自动帮你生成私有属性,
2)帮你生成getter和setter的声明,
3)帮你生成getter和setter的实现。
二、使用步骤
1.例如,有这么一个类:
@interface Student : NSObject
@end
@implementation Student
@end
1)我什么都不做,我就写一个如下语句:
@interface Student : NSObject
@property NSString *name;
@end
2)它已经帮你做很多事情了:
a)自动帮你生成一个私有属性:属性的类型和@property的类型一致,属性的名字和@property的名字一致,自动在前面加一个下划线;
b)自动帮你生成这个属性的getter和setter方法的声明;
c)自动帮你生成这个属性的getter喝setter方法的实现:
setter的实现:直接将参数的值赋值给自动生成的私有属性;
getter的实现:直接返回生成的私有属性的值;
2.使用注意:
1)@property的类型,一定要和要生成的属性的类型一致;
2)@property的名称,要和属性的名称一致,只是去掉下划线;
例如:@property int age;
3)@property也可以批量声明;类型必须相同;
例如:@property float height,weight;
4)@property自动生成的方法实现,没有做任何逻辑验证;
setter:直接赋值;
getter:直接返回;
5)如果你要做逻辑验证,重写setter方法就行了,例如:
(void)setAge:(int)
{
if(age >= 0 && age <= 120)
{
_age = age;
}
}
你重写了setter方法之后,getter方法它还会自动生成吗?答案是:会的!
如果重写了getter , 还会自动生成setter;
如果getter和setter你同时重写,@property就不会自动生成那个私有属性了。那怎么办呢?自己在@implementation里声明私有属性呗!
6)从今天开始,如果你想为类写1个属性,并且为这个属性封装setter和getter,1个@property就搞定。
7)那这个@property可以被继承吗?
答案是:可以被子类继承,但是由于@property生成的属性是私有属性,所以不能被子类直接访问,如果你一定要访问,只能通过setter和getter方法访问。
例如,有一个Animal类:
@interface Animal : NSObject
@property NSString *name;
@end
这时候,自动生成一个NSString *类型的,带下划线的name私有属性,并且自动生成getter和setter方法。
这时候,有一个Pig类从Animal类继承:
@interface Pig : Animal@end
这时候,这个Pig类是不是从Animal类继承啊?它能不能继承Animal的私有属性NSString *类型的_name?答案是:可以。getter方法和setter方法能不能继承?答案是:可以。
但是,在Pig类的方法实现中,它能不能通过self->_name去访问这个_name属性呢?答案是:不行。
@implementation Pig- (void)test
{
self->
}
@end
这样是没有提示的,不能访问。访问不到,为什么?私有的,看都看不见。
但是你可以怎么访问,通过super关键字调用setter方法和getter方法访问,例如:
@implementation Pig - (void)test
{
[super setName:@“jack”];
}
@end
你也可以通过self关键字,调用setter方法和getter方法访问,例如:
@implementation Pig - (void)test
{
[self setName:@“jack”];
}
@end
当然,你也可以通过self关键字和点语法调用setter和getter方法访问,例如:
@implementation Pig - (void)test
{
self.name = @“jack”;
}
@end
- (void)test
总结
到这里,@property就正式结束了,写了3篇文章,这@property就没有别的了。
边栏推荐
猜你喜欢

能添加任意贴图超级复布局的初级智能文本提示器

mysql容器数据卷持久化

【社媒营销】Facebook速推帖子如何运作?值得吗?

Violent recursion to dynamic programming 06 (the sword refers to Offer II 095. Longest common subsequence)

“蔚来杯“2022牛客暑期多校训练营4 补题题解(N)

MATLAB绘制填充图(X轴上下两种颜色)

Latex-查看预收录在arXiv.org上论文的TeX源文件

2022年8月2日——使用idea搭建servlet+jsp项目

The cornerstone of high concurrency: multithreading, daemon threading, thread safety, thread synchronization, mutual exclusion lock, all in one article!...

lombok 下的@Builder和@EqualsAndHashCode(callSuper = true)注解
随机推荐
在表格数据上,为什么基于树的模型仍然优于深度学习?
PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)配置自动连接WIFI无线网络
JSP第一篇 -----JSP九大内置对象(隐式对象)和四大域对象
visual studio 2012 为啥这么优秀
[QNX Hypervisor 2.2用户手册]10 虚拟设备参考
HCIP第十二天_二层MPLS实验
236. The binary tree in recent common ancestor
8 个常用的 Wireshark 使用技巧,一看就会
10大领域5大过程47子过程快速记忆
5.软件测试-----自动化测试
XSS攻击
Violence recursion to dynamic programming 08 (pony go chess)
js垃圾回收机制
236. 二叉树的最近公共祖先
win下使用vscode+wsl2
如何备考PMP才能一次通过?
暴力递归到动态规划 08(小马走象棋)
Violent recursion to dynamic programming 06 (the sword refers to Offer II 095. Longest common subsequence)
DJI内推码(2022年8月2日更新)
flask-socketio实现websocket通信