iOS -@interface/@implementation

@interface...@end :可以理解为相当于c++中类的变量和方法的声明

@implementation...@end :可以理解为相当于c++中类的方法的实现

oc.h中

@interface Person : NSObject

@property (nonatomic,copy)NSString *name;

@property (nonatomic,assign)NSInteger age;

- (void)fun;

@end

oc.m中

@implementation Person

- (void)fun {

    NSLog(@"(void)fun ");

}

@end

在一些代码中 会遇到一些关于@interface别的写法 例如下面这样的

.h中

@interface Person : NSObject{

    NSString*_name;

}

@property (nonatomic,copy)NSString *name;

- (void)fun;

@end

.m中

@interface Person ()

@property (nonatomic,assign)NSInteger age;

@end

@implementation Person

- (void)fun {

    NSLog(@"(void)fun ");

}

@end

主要想扒一下两个问题:

1.为什么.h文件和.m文件里各有1个@interface?它们分别有什么用? 

2.为什么name要定义两遍

.h文件和.m文件里@interface...@end它们分别有什么用? 

.h文件中的@interface 就是典型的头文件,是供其他的class调用的,为外界暴露property和functions;

.m中的@interface ...@end在oc里是这样的:

就是我们常说的类的扩展,是.h文件中interface的补充,但是其变量不暴露出去,只能在.m可见,并且方法不必声明,可以直接在@implementation...@end实现。比如对于上面的代码,当别的class引用当前类的时候,我并不想让别人知道我的age;

为什么name要定义两遍

其实现在用的更多的是第一种写法,几乎已经没有人写两遍了,但是原理还是要理解一下:

严格来说@interface{}里定义的变量,叫作instance variable,它是这个Class内部真正的全局变量,也就是我们常说的实例变量,但是这个变量并不对外公开,所以需要一个对外公开的方法来调用,即@property,作用就是告诉外界,我这个Class里,有这个变量的set/get方法,让你调用来操作该变量。

升级之后,我们只需要声明@property,系统回自动生成实例变量。

说到@property。还要说另外一个@synthesize,有些人会在声明@property之后习惯性的在.m@synthesize一下,它是做什么呢,上面说到,当我们用@property的时候,相当于声明set/get方法,那我们就需要在.m实现该方法,但是一个类里面常常不会说只有一个变量,也就不止一个set/get方法,手动实现太浪费时间,所以@synthesize在.m文件里自动生成了get/set方法。

当然,人越来越懒,Xcode4.4开始之后,编译器会自己为每一个@property自动添加@synthesize,所以我们只需要写@property就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。