/* 1.类和对象 */
/******定义类*******/
1.新建文件, 自动生成.h .m两个文件
2. .h接口部分
3. .m实现部分
创建一个Person类
Person.h
/*********声明特征( 实例变量 )***********/
{
@public
//姓名 字符串
/* 1. NSString 表示字符串, C语言中 char str[10]
2. 实例变量前面必须加下划线 _
3. NSInteger 表示整形
*/
NSString *_name;
//性别
NSString *_sex;
//年龄
NSInteger _age;
}
/*********声明行为( 方法 )***********/
/* 1. - 横线开头 加空格
2. 以 ; 分号 结尾
*/
- (void)sayHello;
- (void)info;
Person.m
/* 实现方法 */
/* 1. 方法后面没有分号 ;
2. NSLog
3. @ OC 对 C语言的扩展
*/
- (void)sayHello
{
NSLog(@"Hello");
}
- (void)info
{
NSLog(@"姓名:%@, 性别:%@, 年龄:%ld", _name, _sex, _age);
}
/********创建对象**********/
1. 导入.h文件
2. 分配内存
3. 初始化
/* 1. alloc 系统提供的方法, 作用:分配内存
2. 指针表示对象的首地址, OC中, 用指针代指对象
3. init 系统提供的方法, 作用: 初始化
4. 分配内存和初始化连写
*/
Person *person1 = [Person alloc];
person1 = [person1 init];
//连写
Person *person2 = [[Person alloc] init];
/*********** 使用对象 ***********/
[person1 sayHello];
[person1 info];
/**********实例变量操作**********/
/***实例变量的赋值***/
/* @public 成员变量用-> 进行赋值 */
person1 -> _name = @"Tom";
person1 -> _age = 20;
person1 -> _sex = @"男";
/***实例变量的取值****/
NSLog(@"姓名:%@", person1 -> _name);
总结:
1. 对象: 一个类的指针变量(指针类的实例变量)
2. 实例变量 : 已经初始化过后的变量
3. 成员变量 : { } 里面写的
4. id : 任意类型的指针变量
5. instancetype : 实例变量类型
6. .h 里写@class 来声明 , 可以是不存在的类,
.m 里写 #import 是拷贝代码, 真实存在的 (重复的不引用)
7. 方法 三要素 : 返回值类型, 方法名, 形参
形参 : 公共的可变(内容是可变的)的变量
8. - : 实例化方法(对象方法)
+: 类方法
(1) 当前方法中没有用到当前类的所有内容(成员变量, 属性)
(2) 简化代码 (可以把成员变量和属性 变成形参传进来)
10. 调用方法步骤:
(1) 先看这个方法属于哪个类的
(2) 看方法是什么类型的(实例化方法, 类方法)
(3) 看返回值类型
11. 封装需要考虑的问题 : 最开始的时候是否忘记赋值 ; 使用时能否进行二次修改
(1)必须给定的变量 (调用初始化方法)
(2)给使用者安全 (提供尽量少的接口 : 属性, 方法)
(3)简化代码 (重复性强)
成员变量可见度有3种:
1.@public类的外部和内部都可以访问的
2.@protected受保护的, 外部不能访问, 内部可以访问
3.@private私有的, 外部不能访问, 内部可以访问, 但是子类不能访问
默认是@protected 受保护的
/*对于@protected修饰实例变量, 外部不能直接访问,提供两个方法, 赋值方法,取值方法 */
创建一个Student类
Student.h
{
@protected
NSString *_hobby;
NSInteger _age;
}
/* 赋值方法 */
/* 1. set 开头
2. 无返回值
*/
- (void)setHobby:(NSString *)hobby;
- (void)setAge:(NSInteger)age;
/** 多个参数赋值方法 **/
// 参数形容词 age
// 参数类型
// 参数名
- (void)setAge:(NSInteger)age hobby:(NSString *)hobby;
/* 取值方法 */
/* 1. 带有一个返回值的无参数的方法
2. OC中 只能带一个返回值
*/
// 返回值类型
//参数
- (NSString *)hobby;
- (NSInteger)age;
Student.m
- (void)setHobby:(NSString *)hobby
{
_hobby = hobby;
}
- (void)setAge:(NSInteger)age
{
_age = age;
}
- (NSString *)hobby
{
return _hobby;
}
- (NSInteger)age
{
return _age;
}
main.m
Student *stu = [[Student alloc]init];
// 赋值方法
[stu setHobby:@"游泳"];
// 取值方法
[stu hobby];
NSLog(@"爱好: %@", [p1 hobby]);
// 赋值
[stu setAge:20];
//取值方法
NSLog(@"年龄: %lu", [p1 age]);
Student.h
- (id)initWithHobby:(NSString *)hobby
age:(NSInteger)age;
Student.m
- (id)initWithHobby:(NSString *)hobby
age:(NSInteger)age
{
_hobby = hobby;
_age = age;
return self;
}
main.m
Student *stu1 = [[Student alloc]initWithHobby:@"Running" age:18];