大家好,关于深入iOS编程核心:第11课——类与属性实现很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
@interface Person : NSObject
/*
声明属性(成员变量)和方法
*/
@end 实现以@implementation 开始,以@end 结束。中间实现方法。
@实施人
/*
方法实现
*/
@end
1、继承
OC中几乎所有的类都是继承的,最终都是继承自基类NSObject。
继承的类称为子类,继承的类称为父类。子类将继承父类的所有属性和方法。
@interface Person : NSObject
这意味着Person继承自NSObject,即Person是子类,NSObject是父类。
@界面人:人
同样,我们也可以创建一个继承自Person的类Man。那么,子类Man将拥有父类Person的所有属性和方法。
2、属性(成员变量)
OC中所有方法都是公共方法,所以OC想通过隐藏函数名(只写实现不写声明)的方式将函数私有化(不能在类外直接调用)。
如果该方法既没有在父类中声明,也没有在子类中声明,子类也可以调用父类方法。
@interface Person : NSObject {
@public //可以在类(对象或子类)内部或外部直接访问。直接访问的格式为: 对象-变量名。
NSString *_name;
@protected //保护类型(默认),也可以在子类中直接访问
NSInteger_age;
@private //私有类型,类外部不能直接访问。它在子类中继承,但不能直接访问。可以通过self 间接访问它。方法,调用setter等。
NSInteger_weight;
}
@end命名约定:在{}中声明成员变量时,添加下划线_
3、类方法和对象方法
类方法以+ 开头,对象方法以- 开头。喜欢:
+(无效)吃;
-(无效)加班;如果我们实例化Person类,得到一个对象XiaoKang,那么Person就只能调用eat方法;而小康只能调用workOvertime方法。
Person *XiaoKang=[[Person alloc] init];
[人吃];
[小康加班];即类方法只能被类调用,对象方法只能被对象调用。
二、@property属性
1、点语法
如果我们设置setter 和getter 方法:
//在.h中声明
@interface Person : NSObject {
NSInteger_age;
}
- (void)setAge:(NSInteger)newAge;
- (NSInteger) 年龄;
@end//在.m中实现
@实施人
- (void)setAge:(NSInteger)newAge {
_age=新时代;
}
- (NSInteger) 年龄{
返回_年龄;
}
@end 然后你可以使用点语法:
#import#import "Person.h"
int main(int argc, const char * argv[]) {
Person *XiaoKang=[[Person alloc] init];
//经典方法
[小康setAge:18];
NSLog(@"经典方法: %ld",[小康年龄]);
//点语法
小康.年龄=25;
NSLog(@"点语法: %ld",XiaoKang.age);
返回0;
}结果:
如果想通过点语法调用setter或getter函数,需要满足以下要求:
setter:-(void)set+(先把成员变量中的“”去掉,首字母大写) :(成员变量的指针类型)
getter:-(成员变量的指针类型)+(去掉“”后成员变量的变量名)
既然这个写法是固定的,那么有没有更好的、更方便使用的方法呢?事实上,这些事情苹果已经做了。我们可以:
在.h文件中
//使用以下行
@property NSInteger 年龄;
//替换setter和getter方法的声明
//- (void)setAge:(NSInteger)newAge;
//- (NSInteger)年龄;在.m 文件中
//使用以下行
@合成年龄=_age;
//替换setter和getter方法的实现
//- (void)setAge:(NSInteger)newAge {
//
//_age=newAge;
//}
//
//
//- (NSInteger)年龄{
//
//返回_age;
//}效果是一样的。
2、property属性(增强)
//查找setter或getter是否缺失,如果没有则补全setter和getter
//生成的变量自动带"_",属性声明的变量为私有类型。
@property NSInteger 年龄;
//可读可写,可以生成setter和getter,默认属性,可以写入多个互不冲突的属性
@property (readwrite) NSInteger 年龄;
//只读,只生成getter
@property(只读)NSInteger 年龄;
//setter: 给setter一个别名
//getter: 给getter 一个别名
@property(setter=setAge: getter=getAge)NSIntegerage;@property增强:Xcode4.4之后,可以使用@property生成setter和getter方法的声明和实现,同时还生成私有成员变量(_property姓名)。也就是说,不需要在{}中声明成员变量,也不需要写@synthesize。
注意:
如果我们自定义(重写)setter方法,@property不会生成它的setter方法,但它仍然会为我们生成getter方法和私有成员变量;如果我们自定义(重写)getter方法,@property将不会生成它的getter方法,但它仍然会为我们生成setter方法和私有成员变量;如果我们同时自定义(重写)setter和getter方法,@property将不会生成它的setter和getter方法,也不会帮助我们生成setter、getter方法和私有成员变量。
3、属性修饰符
//MRC下属性修饰符下的强引用和弱引用
//只要是OC对象,就必须使用强引用。对于基本的C语言类型,可以使用弱引用。
//assign属性修饰符下默认生成的setter是弱引用(_age=age)
@property(非原子,分配)NSInteger年龄;
//retain属性修饰符下默认生成的setter是强引用,retain也用于变量字符串。
@property(非原子,保留)NSMutableArray *arr;
//复制属性修饰符下默认生成的setter是强引用,一般用于NSString*
@property(非原子,复制)NSString *名称;
//ARC下新增赋值操作(兼容MRC下的修饰符)
//strong: 强引用,默认,修改对象指针,会自动保留或释放,ARC环境下Apple推荐
//只要一个对象仍然有一个强引用指针指向它,它就永远无法被释放。
@property (非原子,强) NSMutableArray *arr1;
@property (非原子,复制) NSString* name1;
@property(非原子,分配)NSInteger Age1;
//weak:弱引用,修改对象指针,不修改C的基本类型。当指向的对象消失时,自动变成nil
//@property (非原子,弱) NSMutableArray *arr2;
//unsafe_unretained: 相当于weak。当指向的对象消失时,它不会自动变成nil。如果还是不明白,可以参考以下内容:
文章分享结束,深入iOS编程核心:第11课——类与属性实现和的答案你都知道了吗?欢迎再次光临本站哦!
用户评论
这篇文章讲的东西太棒了!终于对 iOS 类和 @property 属性有了清晰的认识。
有8位网友表示赞同!
之前一直不懂类的意义,看完这篇博客之后豁然开朗。
有10位网友表示赞同!
希望后续的文章能继续深入讲解iOS开发的更多基础知识。
有7位网友表示赞同!
学习编程总是要从基础开始,这篇文正好帮我打好基础!
有19位网友表示赞同!
作者的解释非常到位,易于理解!
【深入iOS编程核心:第11课——类与属性实现】相关文章:
1.蛤蟆讨媳妇【哈尼族民间故事】
2.米颠拜石
3.王羲之临池学书
4.清代敢于创新的“浓墨宰相”——刘墉
5.“巧取豪夺”的由来--米芾逸事
6.荒唐洁癖 惜砚如身(米芾逸事)
7.拜石为兄--米芾逸事
8.郑板桥轶事十则
9.王献之被公主抢亲后的悲惨人生
10.史上真实张三丰:在棺材中竟神奇复活
探寻失联者的踪迹
其实我知道,曾经有过因为感情而彻夜难眠的时候。你曾多次问过自己,那些一大早就睡不着的...
忙碌生活:如何学会放下对别人的讨厌
如果你花时间去恨你讨厌的人,你就会更少时间去爱你喜欢的人。如果你花时间担心那些让你...
探索俄罗斯套娃:揭开这个流行文化符号的真正内涵
不允许使用俄罗斯套娃!近年来互联网背景下俄罗斯套娃模因的意思是“无限复制内容”这个...
深入解析微信插件安装技巧:Xposed系列教程篇(二)
图片旧版本实现效果准备工作Root相关TWRPRecovery:强大的第三方恢复,具有官方Recovery无...