欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入iOS编程核心:第11课——类与属性实现

时间:11-09 现代故事 提交错误

大家好,关于深入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位网友表示赞同!