OC中的类分两个文件,.h用来声明类的变量和函数,.m文件负责实现,与.h配合使用。OC中最根本的类叫NSObject,OC是单继承的。
#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
int _age;
}
@end
这样声明的变量是不能被外界访问的,因为该变量是被@protected修饰的。不管以什么形式访问,编译器都直接报错。
为了能够访问变量。给实例变量写设置器和访问器,即写变量的setter和getter方法。
HXStudent.h
#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
int _age;
}
// 为了能访问age,声明了变量age的getter和setter方法
- (int)age;
- (void)setAge:(int)newAge;
@end
HXStudent.m
#import "HXStudent.h"
@implementation HXStudent
- (int)age {
return <span style="color:#FF0000;">_age</span>;
}
- (void)setAge:(int)newAge {
<span style="color:#FF0000;">_age</span> = newAge;
}
@end
setter和getter方法是公有方法。可以被外界访问。通过setter和getter方法间接访问变量。可以看出我们在类中可以直接
使用
_
来访问变量本身。如下:
#import <Foundation/Foundation.h>
#import "HXStudent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[stu setAge:28];// 等价于stu.age = 28;
int stuAge = [stu age];// int stuAge = stu.age;
NSLog(@"stu age = %d", stuAge);
}
return 0;
}
这样我们就间接访问成员变量。OC中还支持点语法,该语法和对象调用成员变量的setter和getter方法相同,可见点语法就是调用变量的setter和getter方法。
但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量大大增加。幸好从OC 2.0开始,我们能让系统自动生成设置变量值的方法或获取变量值的方法,即系统会自动为我们生成setter/getter方法。减少了代码量,让我们有更多的精力放在程序的业务逻辑上。
.h:@property为属性声明getter和setter方法
.m:@synthesize为属性实现getter和setter方法
如下:
HXStudent.h
#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
int _age;
}
@property (nonatomic, assign) int age;
@end
HXStudent.m
#import "HXStudent.h"
@implementation HXStudent
@synthesize age = _age;
@end
我们来使用HXStudent类,如下:
#import <Foundation/Foundation.h>
#import "HXStudent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
HXStudent *stu = [[HXStudent alloc] init];
stu.age = 28;
int stuAge = stu.age;
NSLog(@"stu age = %d", stuAge);
}
return 0;
}
可以看出,使用property和synthesize声明变量,系统会帮我们自动生成变量的setter和getter方法,来间接访问变量。我们可以避免手工编写繁琐的setter 和 getter方法,节省编写代码的时间。
@property: 新的编译器指令,主要功能是为我们自动“生成”,setter和getter方法的声明。(注意:我们是看不到这些代码的)
@synthesize:与@property相对应的新的编译器功能。主要是为我们自动生成,setter和getter方法的功能实现。(注意:我们也不会看到相应的代码)
我们也可以在HXStudent类中使用_来访问变量本身。
使用property和synthesize,再设置一些属性就能做一些内存管理方面的问题。手动生成的getter和setter只是简单的赋值和取值。手动的也可以管理内存方面的问题,但太过复杂。
后来的OC就连synthesize也给省略了,在.h文件中直接使用property就能做到以上的功能。如下:
HXStudent.h
#import <Foundation/Foundation.h>
@interface HXStudent : NSObject
@property (nonatomic, assign) int age;
@end
HXStudent.m
#import "HXStudent.h"
@implementation HXStudent
@end
我们也在main函数中使用以下,如下:
#import <Foundation/Foundation.h>
#import "HXStudent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
HXStudent *stu = [[HXStudent alloc] init];
stu.age = 28;
int stuAge = stu.age;
NSLog(@"stu age = %d", stuAge);
}
return 0;
}
用法还是没有变。可见使用property声明的量,系统会自动生成setter和getter方法。使用点语法就是调用变量的setter和getter方法。本文是在非ARC环境下讲解的。