博客> @class @interface @property @synthesize区别
@class @interface @property @synthesize区别
2019-12-11 06:08 评论:0 阅读:929 gedefu
iOS@class @interface @property @synthesize区别

1.引用一个类的两种办法 @class:如果你只是定义成员变量、属性

import:如果是继承某个类

2.两种方法的区别

import方式会包含被引用类的所有信息,包括被引用类的变量和方法;

@class方式只是告诉编译器在A.h文件中,B*b只是类的声明,具体这个类有什么信息,这里不需要知道。等实现文件中真正需要的时候,才会真正查看B类中的信息。 @class方式 使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以在.m文件中需要使用#import来包含引用类的头文件。 如果又上百个头文件都#import同一个文件,或者这些文件依次被#import,那么一旦最开始得头文件改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也可想而知的,而相对来讲,使用@class方式就不会出现这种问题。 当出现循环依赖干系的时候,#import会报错。

@interface{}里定义的变量,叫作instance variable,它是这个Class内部真正的全局变量。然而这个instance variable是不对外公开的,因此我们还需要一个对外公开的东西来调用,就是@property @property是对外的,它其实是告诉大家,我这个Class里,有一个变量的set/get方法。比如,@property NSString* string; 就是说,本Class里有一个getString/setString供你们调用。

@property 一个变量后,在@implementation里再@synthesize一下,相信是很多人的习惯。但是为什么要有这个@synthesize方法呢?

@property是对外声明了Class的get/set方法,然后我们就需要在.m文件里手写get/set方法。这可就麻烦了,1个变量对应2个方法,假如一个Class里有10个变量,那岂不是要写20个方法?烦也烦死唠。 @synthesize帮我们解决了这个问题。@synthesize在.m文件里自动生成了get/set方法。因此,我们只要在@implementation后面加上一行:@synthesize 就可以自动生成get/set方法了,省掉了很多麻烦。比如@synthesize value1 = _value1;的意思就是,将instance variable _value1用作getValue1和setValue1方法里。 get/set方法有时候是比较复杂的,因为它和变量的属性相关,就是@property(nonatomic, assign/retain(strong/weak))这就和内存有关了。然而@synthesize为我们做了这些事情,就不要再为这些事情烦恼了!

更方便的是,从Xcode4.4开始,编译器会自动为每一条@property都添加一条对应的@synthesize,因此以后我们只要写一个@property就可以了!

收藏
0
sina weixin mail 回到顶部