当前位置:网站首页>【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就没有别的了。
边栏推荐
猜你喜欢
随机推荐
Incorrect datetime value: ‘2022-01-01‘ for function str_to_date
2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,
【Gopher 学个函数】边学边练,简单为 Go 上个分
PyCharm中常用的快捷键用法详解
常用工具链和虚拟环境-WSL
7-Redis工具类
mysql容器数据卷持久化
梅科尔工作室-14天华为培训三
20、商品微服务-web层实现
“蔚来杯“2022牛客暑期多校训练营4 补题题解(N)
代码工具推荐
FLIR E95 在8层楼看马路上行驶的CAR的热成像形态?
超级复杂可贴图布局的初级智能文本提示器
开发JSP应用的基础知识
OpenWRT设置ipv6网络
List转Map的几种方式
PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)刷入EMMC
一个人的精力
iNFTnews | 元宇宙的潜力:一股推动社会进步的力量
一篇文章玩明白Stack-migration