Student.h文件
#import <Foundation/Foundation.h>
/* 1.@interface 是接口文件,表示一个类的开始
2.Student 是当前的类名
3.NSObject 是集成的父类
4.类到 @end 才结束
5.文件名与类名没有关系,但是为了方便对文件里的类进行管理,所以让文件名和类名相同
6.文件中可以写多个类,但是还是方便管理原则,一个文件中只写一个类
*/
@interface Student : NSObject /*类包括特征和行为*/
//特征
{
@public
//成员变量(实例变量)
NSString *_stuName; //姓名
NSString * _stuSex; //性别
NSInteger _stuAge; //年龄
CGFloat _stuScore; //成绩
NSString *_stuHobby; //爱好
}
//行为
-(void)sayHi;
-(void)eat;
-(void)play;
/*
******有关成员变量的可见度问题*********
public protected private package
1.@public 级别最低,都可以通过对象的 -> 方式找到,不安全
2.@protected 不写public默认为它的下一个级别protected, 被保护的成员变量可以在当前类及其子类中使用
3.@private: 私有的,只能在当前的类使用,使用范围更小
4.@package:这个是系统的一些文件来使用,系统用,如果看见,直接跳过去
*/
//********最全的自定义初始化方法******************
//自定义初始化方法声明
-(id)initWithStuName:(NSString *)stuName
StuSex:(NSString *)stuSex
StuAge:(NSInteger)stuAge
StuScore:(CGFloat)stuScore
StuHobby:(NSString *)stuHobby;
//便利构造器
/*
1.是一个+方法
2.便利构造器把创建对象的过程放到了程序的.m文件周昂,这样通过类,直接就能创造一个对象
3.系统提供了很多便利构造器的方法
*/
/*方法一共可以分为两种:1.类方法+ 一般类来进行使用 比如alloc ;2.实例方法- 一般对象来调用 比如我们自己写的sayHi,init*/
+(Student *)StudentWithStuName:(NSString *)stuName
StuSex:(NSString *)stuSex
StuAge:(NSInteger)stuAge
StuScore:(CGFloat)stuScore
StuHobby:(NSString *)stuHobby;
//***********有关成员变量的赋值***********
//1.对所有成员变量的赋值语句
-(void)setStuName:(NSString *)stuName
setStuSex:(NSString *)stuSex
setStuAge:(NSInteger)stuAge
setstuScore:(CGFloat)stuScore
setStuHobby:(NSString *)stuHobby;
//2.设置器和访问器:针对一个成员变量进行值的存储和读取,当多个成员变量进行操作的时候,称之为赋值语句
//设置器
-(void)setStuname:(NSString *)stuName;
-(void)setStuSex:(NSString *)stuSex;
-(void)setStuAge:(NSInteger)stuAge;
-(void)setStuScore:(CGFloat)stuScore;
-(void)setstuHobby:(NSString *)stuHobby;
//访问器
-(NSString *)stuName;
-(NSString *)stuSex;
-(NSInteger)stuAge;
-(CGFloat)stuScore;
-(NSString *)stuHobby;
@end
Student.m文件
#import "Student.h"
@implementation Student
//行为的实现
-(void)sayHi{
NSLog(@"%@, %@, %ld, %g, %@", _stuName, _stuSex, _stuAge, _stuScore, _stuHobby);
}
-(void)eat{
NSLog(@"吃");
}
-(void)play{
NSLog(@"玩");
}
//*********自定义初始化*************
-(id)initWithStuName:(NSString *)stuName
StuSex:(NSString *)stuSex
StuAge:(NSInteger)stuAge
StuScore:(CGFloat)stuScore
StuHobby:(NSString *)stuHobby{
self = [super init]; //先调用父类的初始化方法,对父类继承过来的成员变量进行设置
if (self) {
_stuName = stuName;
_stuSex =stuSex;
_stuAge = stuAge;
_stuScore = stuScore;
_stuHobby = stuHobby;
}
return self;
}
//当这个对象在初始化的过程中出现问题,会返回一个空指针,如果是空指针,接下来的赋值就没有意义,跳过去;如果返回的是一个正常的堆空间地址,才能继续赋值
//有关空指针错误:
/*
C语言中如果针对一个空指针操作,比如赋值,系统运行到该句代码会马上崩溃,而在OC中遇到空指针会把这句代码当做废代码,会执行,但不会有任何效果
*/
//**********便利构造器************
+(Student *)StudentWithStuName:(NSString *)stuName
StuSex:(NSString *)stuSex
StuAge:(NSInteger)stuAge
StuScore:(CGFloat)stuScore
StuHobby:(NSString *)stuHobby{
Student *student =[[Student alloc]initWithStuName:stuName StuSex:stuSex StuAge:stuAge StuScore:stuScore StuHobby:stuHobby];
return student;
}
//********所有成员变量赋值***********
-(void)setStuName:(NSString *)stuName
setStuSex:(NSString *)stuSex
setStuAge:(NSInteger)stuAge
setstuScore:(CGFloat)stuScore
etStuHobby:(NSString *)stuHobby{
_stuName = stuName;
_stuSex = stuSex;
_stuAge = stuAge;
_stuScore =stuScore;
_stuHobby =stuHobby;
}
//******设置器和访问器*********
-(void)setStuname:(NSString *)stuName{
_stuName =stuName;
}
-(void)setStuSex:(NSString *)stuSex{
_stuSex =stuSex;
}
-(void)setStuAge:(NSInteger)stuAge{
_stuAge =stuAge;
}
-(void)setStuScore:(CGFloat)stuScore{
_stuScore = stuScore;
}
-(void)setstuHobby:(NSString *)stuHobby{
_stuHobby = stuHobby;
}
//访问器
-(NSString *)stuName{
return _stuName;
}
-(NSString *)stuSex{
return _stuSex;
}
-(NSInteger)stuAge{
return _stuAge;
}
-(CGFloat)stuScore{
return _stuScore;
}
-(NSString *)stuHobby{
return _stuHobby;
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import"Student.h"
int main(int argc, const char * argv[])
{
//基本使用方法
/*
NSLog(@"鱼班长");
NSInteger i = 100; //整型
NSLog(@"%ld", i);
CGFloat f = 3.14; //浮点型
NSLog(@"%g", f);
NSString *str = @"liushan山"; //字符串 OC中字符串可以使用中文
NSLog(@"%@", str);
NSArray *arr = @[@"1", @"2"]; //OC里的数组
NSLog(@"%@", arr);
for (NSInteger i = 0; i < 2; i++) { //遍历数组
NSLog(@"%@", arr[i]);
}
*/
创建一个对象:
创建对象需要两步
1.需要给对象开辟空间, 开辟堆空间内存
2.对象内存开辟后,需要对对象进行初始化设置
Student *stu = [Student alloc];
stu = [stu init];
//把两步合并到一起
Student *stu = [[Student alloc]init]; //初始化空值
[stu sayHi]; //通过对象来调用行为
//操作成员变量:
NSLog(@"%@", stu ->_stuHobby); //对象通过 -> 来访问自己的成员变量
stu -> _stuAge = 23; //赋值
stu -> _stuName = @"杨林"; //修改字符串可直接赋值
NSLog(@"%@", stu ->_stuName);
stu -> _stuName = @"刘珊珊";
NSLog(@"%@",stu ->_stuName);
//自定义初始化:
Student *stu = [[Student alloc]initWithStuName:@"yeting" StuSex:@"女" StuAge:26 StuScore:80.5 StuHobby:@"玩"];
[stu sayHi];
//**********便利构造器创建对象**************
Student *stu = [Student StudentWithStuName:@"haha" StuSex:@"男" StuAge:28 StuScore:78 StuHobby:@"足球"];
[stu sayHi];
//***********所有成员变量赋值***************
Student *stu = [[Student alloc]init];
[stu setStuName:@"yeting" setStuSex:@"女" setStuAge:26 setstuScore:98 setStuHobby:@"玩"];
[stu sayHi];
****设置器和访问器
[stu setstuHobby:@"玩"];
NSLog(@"%@", [stu stuHobby]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
属性
## Person.h文件 ##
#import <Foundation/Foundation.h>
@interface Person : NSObject
//属性
//属性一共做了3件事,
//1.声明了设置器setter和访问器getter
//2.实现了设置器和访问器
//3.声明了成员变量,成员变量命名会在属性名的前面加一个下划线
//具体的数据的存储,还是成员变量来完成,属性只不过帮助程序员完成了一些琐碎的工作,简化了代码
@property NSString *name;
-(void)sayHi;
//属性的属性
//第一类:读写控制:readonly, readwrite
//readonly设置之后,属性就没有setter方法,默认是readwrite
//setter和getter
//@property(readonly)NSString *hobby;
//setter和getter的作用是给设置器和访问器的方法重新写了一个名字,注意:设置器在名的设置的时候不要忘记了:
@property(setter = nihao:, getter = buhao)NSString *hobby;
//第二类: 原子性控制 默认初始值是atomic
//通过原子性atomic来监控事务在整个过程中有没有完成,但是一般来讲我们就是对数据的的简单赋值, 一般这部分我们用非原子性nonatomic
@property(atomic)NSString *sex;
//第三类:语义设置 有关内存管理,引用计数
//copy, assign, retain
//retain 一般是对象类型会用到,比如我们自己写的类,嗨哟NSArry会用
//assign一般是NSInteger,CGFloat会使用,因为他们在栈区,不需要内存管理,所以用assign
//copy一般只有字符串会使用copy
@property(nonatomic, copy)NSString *color;
@property(nonatomic , assign)NSInteger age;
@property(nonatomic, assign)CGFloat score;
@property(nonatomic, retain)NSArray *arr;
@end
## Person.m文件 ##
@implementation Person
//属性的实现
//关键词是@synthesize, 前面放属性名,后面放对应的成员变量
//在Xcode4.5之后才开始不写的,所以在之前的老的工程里,还有大量的@synthesize
//@synthesize name = _name;
-(void)sayHi{
NSLog(@"%@", _name);
}
@end
## main.m文件 ##
#import <Foundation/Foundation.h>
#import"Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
Person *per = [[Person alloc]init];
//对象通过设置器对成员变量内容进行修改
[per setName:@"你好"];
//对象昂通过访问器来进行取值
NSLog(@"%@", [per name]);
Person *per = [[Person alloc] init];
[per nihao:@"1" ];
[per buhao];
Student *stu = [[Student alloc]init];
[stu setStuName:@"鹰王"]; //getter
NSLog(@"%@", [stu stuName]);
//针对对象的属性,我们可以使用点的语法,来获取对象的内容,也可以进行设置
stu.stuName = @"崔某"; //setter
NSLog(@"%@",stu.stuName);
//通过点语法,可以对属性进行操作,大量的节省了代码
//离=号近的是setter方法,其余的都是getter方法
//kvc
//key - value - coding 键值对编码
//把属性名看成shikvc中的key键,把要修改的值看成是value,然后通过kvc的方法,把值赋给指定的key
[stu setValue:@"崔某" forKey:@"stuName"];
NSLog(@"%@",stu.stuName);
NSLog(@"%@", [stu valueForKey:@"stuName"]);
super:
是编译器指令,并非对象
给super发送消息,可以执行父类中实现的方法
例:
子类可以重写父类中的方法,如果子类有自己的重写的父类的方法的实现.还想要使用父类中的方法,可以向superfa发送消息
@class
避免循环嵌套导入头文件