iOS的.h跟.m文件

iOS开发中OC的.h文件跟.m文件

1.文件

1.1.h文件

1
2
3
4
5
6
7
@interface ClassName{
NSString* _value1;
}
@property(nonatomic,assign)NSString* value1;
-(void)func1;

1.2 .m文件

1
2
3
4
5
6
7
8
9
10
11
@interface ClassName(){
}
@end
@synthesize value1;
@implementation ClassName
-(void)func1{
}
@end

2. 问题

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

.h里面的@interface,不消说,是典型的头文件,它是供其它Class调用的。它的@property和functions,都能够被其它Class“看到”。

用我的话理解就是,如果写在了.h的@interface的属性和方法就是public可以被外面调用的。写在了.m的@interface里面就是private

因此,我们将对外开放的方法、变量放到.h文件中,而将不想要对外开放的变量放到.m文件中(.m文件的方法可以不声明,直接用)。

2.2.h中,value1为什么要定义2遍?

当然,现在@interface{}里的定义也可以省略掉了,不过原理还是要搞清楚。

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

因此需要2次声明。当然现在lldb也升级了,只要你声明了@property,它就可以自动创建对应的全局变量。

2.3@synthesize有什么用?

@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为我们做了这些事情,就不要再为这些事情烦恼了!