当前位置:网站首页>【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就没有别的了。
边栏推荐
猜你喜欢
HCIP第十二天_二层MPLS实验
Latex-查看预收录在arXiv.org上论文的TeX源文件
软件定义网络实验之SDN网络简单管理及开发
mysql容器数据卷持久化
Incorrect datetime value: ‘2022-01-01‘ for function str_to_date
20、商品微服务-web层实现
LabVIEW程序框图保存为图像
暴力递归到动态规划 06 (剑指 Offer II 095. 最长公共子序列)
【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)
[Example构造方法增加notNull参数,默认false,允许值为null,值为null的时候不加入到条件中
随机推荐
9-WebUtil工具类.md
在表格数据上,为什么基于树的模型仍然优于深度学习?
The Multiversity 的 “非常重要的生命体” NFT 推出
做快乐的事情
什么情况下DigiCert证书会引起发生安全警报?
嵌入式开发:嵌入式基础——’ ’和” ”的区别
flask-socketio实现websocket通信
OpenWRT设置ipv6网络
开发JSP应用的基础知识
Linear DP
Greenplum数据库故障分析——can not listen port
【SQL】—数据库操作、表操作
PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)配置自动连接WIFI无线网络
sql注入是什么意思以及防止sql注入?
8 个常用的 Wireshark 使用技巧,一看就会
提高测试覆盖率的四大步骤
可信的SSL证书颁发机构有哪些
项目管理到底管的是什么?
DTD约束和Schema约束
大厂标配 | 百亿级并发系统设计 | 学完薪资框框涨