//-----------------------对象存储细节
1. 当创建一个对象的时候:Person *p1 = [Person new] 做了三件事情:
1)申请堆内存空间;
1)给实例变量初始化
1)返回所申请空间的首地址;
2. 实例变量保存在堆区
3. 对象方法保存在代码区
4. 一个类可以创建多个对象;
'高地址'
栈区
堆区
全局区(静态区) (BSS段,数据段)
代码区
'低地址'
只要new一下,就会在堆区开辟一个空间
//分析:
Person *p1 = [Person new];
类的信息 ------> 代码区
p1(局部变量) ------> 栈区 (代码段结束 释放)
[Person new] -----> 堆区
//-----------------------函数和对象方法的区别
# 对象方法
-(void)run;
(1)对象方法的实现在@implementation...@end中
对象方法的声明只能写在 @interface...@end中间
(2)对象方法都以-号开头
(3)对象方法只能由对象来调用
(4)对象方法归对象所有
(5)对象方法可以"直接使用"实例变量
-----------------------------------------------
# 函数
函数: void run(){
}
(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
(5)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。
函数不允许嵌套定义,可以嵌套调用
//------------------常见错误汇总
1)@interface @end和@implementation @end不能嵌套包含
2)只有类的声明没有类的实现
只有@interface没有@implementation时,程序编译能够通过,但是执行报错
3)漏写@end
4)两个类的对象声明顺序(可以把顺序打乱)
5)成员变量没有写在{}里 错误的
6)方法的声明写在了{}里面 错误的
7)在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
8)方法无法像函数那样的调用(对象方法必须由对象来调用)
10)类的实现可以写在main函数后面,在使用之前只要有声明就可以
#warning 列举这些常见错误,是为了告诉大家要往正确的方向去学习去编写代码.把自己编写代码的习惯更正过来
//-------类的声明
@interface <#class name#> : <#superclass#>
@end
//------类的实现
@implementation <#class#>
<#methods#>
@end
//------主函数
int main(){
return 0;
}
//--------------------------------
@try {
//有可能出错的代码
}
@catch (NSException *exception) {
//扑捉
}
@finally {
//都执行
}
解释:
@try 有可能出错的代码出错了 才会执行 @catch里面的代码
如果@try里面的代码没出错@catch不会走
@finally 不管有没有异常都会执行
//------------------对象和方法之间的关系
-(返回值)方法名1:(参数类型) 参数名;
//(1),对象作为方法的参数
-(void) displayPerson:(Person *)person{
NSLog("姓名:%@",person->name);
}
//(2),对象作为方法的返回值
-(Person *)changePerson:(Person *)person{
person->name = @"唐僧";
return person;
}
@interface Person : NSObject
{
int _age;
}
//----------------------------------
-(void)putPerson:(Person *)person;
-(Person *)getPerson;
-(Person *)showPerson:(Person *)person;
//---------------------------------------
@end
@implementation Person
@end
int main(){
//创建一个对象
Person *person = [Person new];
// 类名: 首字母大写 Person
// 对象名 person
//由对象调用 传递到putPerson方法里的参数
[person putPerson:person];
}
//----------------练习1分析
-(BOOL)compareColorWithOther:(Dog *)dog{
//拿当前的狗的颜色和另外一条狗的颜色比较
if(_color == dog->_color){
return YES;
}
return NO;
}
# 分析 :
1.这是一个对象方法
2.返回值类型为 BOOL
3.方法名为: compareColorWithOther:
4.有参数,参数类型为Dog *类型
_color 哪个对象调用这个方法, _color就是那个对象的_color
dog->_color 传进来的dog的_color
//----------------练习2分析
//关联关系(之后还会着重讲) 人拥有狗这个成员变量
@interface Person : NSObject
{
@public
Dog *_dog; //null 关联关系 Person对象里面拥有了一个Dog对象
}
......
Person *p = [Person new];
//给p一个dog
p->_dog = d1; //人拥有d1这只狗
//人的方法
-(void)feedDog:(Dog*)dog{ // 人的方法 由人调用这个方法
// 狗要吃 ---> 找狗
[对象 eat];
// 1.找对象 没有? 3个方法
// 1. _dog 人拥有这个对象(人的实例变量) (理解)
// 2. 作为参数传递进来
// 3. new一个狗
}
nil 调用任何方法不会有效果
_dog 赋值
//-----------------对象作为方法的参数连续传递
1.人 拥有开枪的行为
2.枪 拥有发射子弹的行为
3.子弹 控制子弹数的减少
-(void)fireByGun:(Gun *)gun andBullet:(Bullet *)bullet{
//让枪射击
//把子弹传递给 枪
[gun shoot:bullet];
}
-(void)shoot:(Bullet *)bullet{
//开枪应该做哪些事情?
//如果 子弹的个数 > 0 可以减-1
if(bullet->_bulletCount>0){
// 1) 子弹数 -1
bullet->_bulletCount --; // bullet->_bulletCount = billet->_bulletCount -1;
// 2) 打印机剩余的子弹数
NSLog(@"biu biu biu....剩余子弹数:%d",bullet->_bulletCount);
}else{
NSLog(@"都没有子弹了,你还突突个毛线~");
}
}
/* 练习方法
1----看到题目 写代码 习惯写注释
2----看着题目 写伪代码 写完伪代码 可以尝试敲代码
3----copy题目 copy伪代码 尝试去写代码
4----打开现成代码 看懂这个代码 对着敲 至少也得敲3遍,然后得自己独立敲出来
*/
今晚思考:
/*
设计一个”学生“类
1> 属性
* 姓名 name
* 生日 birthday
用结构体作为类的实例变量(生日)
*/
//------结构体作为类的实例变量。给结构体赋值的三种方法:
typedef struct {
//年
int year;
//月
int month;
//日
int day;
}MyDate;
//第一种:直接赋值,并强转;
stu->_birthday =(MyDate){1983,12,12};//直接赋值,并强转;
//第二种:先定义,然后在赋值
MyDate d1 = {1981,11,11}; //定义结构体变量的同时进行初始化
stu->_birthday = d1;
//第三种方法,逐个赋值
stu->_birthday.year = 2014;
stu->_birthday.month = 12;
stu->_birthday.day = 11;
|