@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就可以了。