方法
系统提供的init方法只会为实例变量赋默认值,没有意思,如果想在初始化阶段给实例变量赋值,需要自定义初始化方法
Student *stu = [[Student alloc] initWithName:@"Duck" age:20 number:9527 score:65.6];
什么样的才叫做对象?
OC的类定义的指针变量都可以间接的叫做对象,不管有没有存储堆区空间的地址
实例变量默认可见度是@protected.
1.为什么不默认@public?
@public,公开的,会暴漏内部实现细节,外界可以随时更改实例变量的数据,不安全,违背了封装的特性
2.为什么不默认@private?
@private,私有的.只能本类文件中访问,子类文件访问不了,违背了继承的特性
实例变量可见度是@protected,外界无法通过->访问实例变量,如果想变量赋值,或者获取实例变量的值,需要Person类给外界提供赋值以及取值的方法.(接口)
为”单一”实例变量赋值的方法叫做setter方法(设置器).
获取”单一”实例变量值的方法叫做getter方法(访问器).
setter方法命名规范:
- 号方法 无返回值 set开头+对应的实例变量名(首字母大写) 有且只有一个参数,参数的类型和实例变量类型相同,参数名和实例变量名相同.
getter方法命名规范
- 号方法 有返回值,返回值类型和实例变量类型相同, 方法名和实例变量名相同,无参数
这里说的实例变量名是去掉下划线的.
id 泛型,和void *类似,代表对象的地址.
@class 声明后面的字符串可以当做类来用.
初始化 – 是在对象空间开辟之后立即给实例变量赋值,叫做初始化.
虽然提供了很多的初始化方法,但是对于一个对象来说只能调用一个初始化方法,因为一个对象初始化阶段就只有一次.
方法嵌套调用:
1.+号方法中调用另外一个+号方法: [类名/self 方法].
+ (void)test1 {
//调用test2
//[Person test2];
[self test2];
}
2.-号方法中调用另外一个-号方法: [self 方法].
- (void)test3 {
//调用test4
[self test4];
}
3.-号方法中调用另外一个+号方法: [类名/[self calss] 方法].
- (void)test4 {
//调用test1
//[Person test1];
[[self class] test1];//[self calss] 获取对象所属的类
}
4.+号方法中调用另外一个-号方法: 创建对象调用方法
+ (void)test2 {
//调用test3
Person *per = [[Person alloc] init];
[per test3];
}
类是一个抽象的概念,用来创建对象,对象才是具体的,所以类不占空间,只有对象才占空间,只有对象的空间有了,实例变量才会有空间,所以在+(类)方法中无法访问实例变量.