------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 传统get和set方法
set方法命名规范
方法名必须以set开头,是一个对象方法
set后面跟去掉下划线,首字母大写的成员变量名
返回值一定是void
必须有一个参数,参数类型类实例变量类型一致
形参名和成员变量名一般不一致
在set方法中一定要给成员变量赋值
get方法命名规范
一定有返回值,返回值类型和成员变量名一样
方法名和去掉下划线的实例变量名一样
不需要接受任何参数
是一个对象方法
返回值一定是实例变量值
2. 点语法
点语法是Xcode的特性,Xcode帮我们做代码替换,点语法并不是直接访问成员变量,实际是set和get方法的调用,使用时必须存在get和set方法
点语法的使用:p.age=18; p.name=@"xxxx";
点语法使用陷阱如下,在点语法中调用self,会重复调用自身陷入死循环
-(void)setAge:(int)newAge{
self.age=newAge;
}
3. @property关键字
@property是编译器指令,在Xcode4.4之前,@property只进行get和set方法的声明,需要手动实现或使用@synthesize关键字进行实现,在Xcode4.4之后,@property有增强功能,声明和实现set和get方法,并且操作带有下划线的实例变量,如果当前类没有下划线的实例变量,系统会帮我们生成。
@property用法
@property 类型名 方法名 eg:@property int age //Xcode4.4之前相当于进行了age的get和set方法的声明
@property使用注意事项:只能写在@interface @end之间
4. @synthesize关键字
@synthesize用法——@synthesize 方法名
@synthesize在.m文件中定义set和get方法的实现,使用@synthesize时方法名一定要在.h文件中使用@property进行声明
eg: @synthesize age; //生成了一个变量age,和_age没有关系
相当于如下代码:
-(void)setAge:(int)age{
self->age=age;
}
-(int)age{
return age;
}
使用@synthesize指定实例变量赋值
@synthesize age=_age; //set和get方法操作的是指定的实例变量_age而不是生成的实例变量age
相当于如下代码:
-(void)setAge:(int)age{
_age=age;
}
-(int)age{
return _age;
}
@property int age;//会生成一个实例变量_age,并且实现_age的set和get方法的声明和实现,但是生成的_age是私有的,不允许子类继承和使用。
在@property增强下重写set和get方法时,只能重写一个,如果两个都重写,需要在.m文件中加上@synthesize
6. 构造方法——init
构造方法用来初始化对象,是一个对象方法。
重写构造方法的目的是为了让对象一创建出来,成员变量就有一些固定值。
new方法可以拆分为alloc 和init方法
重写构造方法的示例代码如下:
#import "Student.h"
@implementation Student
//重写构造方法使每个学生对象创建后年龄都为6岁
- (instancetype)init
{
self = [super init];
if (self) {
_age=6;
}
return self;
}
@end
7. 自定义构造方法
自定义构造方法的规范:
一定是对象方法
返回值是id或instancetype类型
方法以initWith开头
自定义构造方法比重写构造方法更灵活,因为重写构造方法时每次初始化的值都是固定的
#import "Student.h"
@implementation Student
//自定义构造方法,使每次创建的对象用指定的值初始化
- (instancetype)initWithName:(NSString *)name andAge:(int)age
{
self = [super init];
if (self) {
_name=name;
_age=age;
}
return self;
}
@end
使用自定义构造方法,子类只处理自己独有的属性。