黑马程序员技术交流社区

标题: OC笔记分享 [打印本页]

作者: z276698840    时间: 2016-3-29 08:11
标题: OC笔记分享
//--------依赖关系:
A对象作为B对象的局部变量或是方法形参的,B依赖与A,这时候我们称A与B之间存在一种依赖关系

1.car对象作为方法形参
人坐车回家
[person goHome:car];


2.car对象作为局部变量
-(void)goHome{
   
    Car *car = [Car new];
   
    [car run];
   
}

[person goHome];


//--------关联关系
当一个对象拥有另外一个对象的时候, 当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系
关联关系是面向对象中最常用一种关系

@interface Person : NSObject
{
    Dog *_dog;   //关联关系
   
}

Person *person = [Person new];   1.2.初始化  对象类型 nil


[person liuDog];

-(void)liuDog{
   
    [_dog run];  // [nil run];
   
}



注意:
别忘了给_dog写set/get方法,new默认初始化为null

//---------
在一个方法里,如果要找对象,没找到,怎么办?
1.new一个对象               ----依赖关系
2.作为方法参数传一个对象进来   ----依赖关系
3.对象作为另一个对象的实例变量  ---关联关系


理解:关联关系的耦合度要高于依赖关系
编程方向: 低耦合,高内聚


//------------------文档安装和方法重载:
1. 在线安装
xcode-> 系统偏好设置->Doucument->下载

2. 离线安装

第三方软件:dash


3. 方法重载:  是指在一个类中定义多个同名的方法,参数类型不同

"OC中没有方法的重载"

-(void)run;   //  run

-(void)run:(int)speed;   // run:

-(void)run:(float)speed; //   run:


关键点:
找方法名,方法名不允许相同

编译器检查方法  只要检测到方法名相同就会报 方法名重名的错误


//---------------static关键字:
1. 在c语言中  static可以修饰
局部变量(延长局部变量的生命周期)、
全局变量(当前变量只能再当前文件中使用)
函数   (当前函数只能再当前文件中使用)

2. 在OC中, 不能用来修饰实例变量和方法, 但是可以修饰局部变量, 全局变量


//-------------------self的理解
self和super:

self理解:自己   简单理解:   谁调用当前方法, self就代表谁.

super代表的是父类.(简单理解) ....

super  父类 (超类)  ...


self的使用
1)用在对象方法
2)用在类方法
3)访问实例变量



self的学习方法

    在不同的地方self代表


//-----------------self使用在对象方法
若以%@打印对象   <类名 : 这个对象的地址>   //对象的描述信息

Person *p = [Person new];

%@  --->   p    ---->  对象p的描述信息

%p ----->   p    ----->  地址


在对象方法中,self代表的是调用当前方法的对象,只有对象才可以调用对象方法



self用在对象方法中,self就代表调用这个方法的对象(方法的调用者)





中午思考练习:
{
   
    int _age;
   
    int name;
   
   
}

-(void)setAge:(int)age{
   
    _age = age;
   
}

-(void)setName:(int)name{
   
    self->name = name;  //可以的
   
    self.name = name;  //  self.name   点语法  .   死循环   set / get   不可以的
}










实例变量_age  的 setter方法
-(void)age:(int)age{
   
   
   
    _age == self->_age
   
    self->age = age;
   
}



//----------------self使用在类方法中
在类方法中,  self代表的是当前类,只有类名才可以调用类方法.


//------先知道,明天再具体分析
获取当前对象的类:

Person *p = [Person new];   //Person是一个类型  也是一个类类型的对象

[p class] == [Person class] == Person(类名)

返回当前类

若以%@打印对象   <类名 : 这个对象的地址>   //对象的描述信息
%@打印类对象/类    类名


//---------------self访问成员变量
在对象方法中可以通过 self->_speed访问成员变量.


-(void)run:(int)age{
   
   
    //self    现在在哪里    对象
   
    self->age = age;
   
}

//-----------------self调用方法


//   self  代表什么

+  self    当前类

-   self    对象

[self 方法名称]; (类方法/对象方法)


注意:
在对象方法中不要使用self调用自身方法
在类方法中不要使用self调用自身方法



//--------------继承和派生:
建立继承关系:

1.导入头文件
2.修改声明文件

@interface 类名:父类名

@end


#特点: 子类拥有父类的所有属性跟方法  (除了私有属性跟私有方法)


派生: 父类向下产生子类的过程称为派生


派生类拥有基类的属性和方法,还有自己派生的新增的属性和方法


基类: 最初始最基本的类 (父类)


派生类: 子类


"继承是面向对象思想的一个特性,是一种思想"


派生类拥有基类的属性和方法,还有自己派生的新增的属性和方法

# 方法重写:把父类的方法,在子类中重新给实现了

重写父类的方法不需要写声明


super 对象方法   ---->  调用这个方法的对象的"父类对象"

super 类方法    ----->  当前类的"父类"


继承的注意事项:
1. 子类不能定义和父类同名的变量,但是可以继承父类的变量

2. OC类支持单一继承,不支持多继承

3. OC类支持多层继承




//-----------------继承体系中方法调用的顺序
1、在自己类中找
2、如果没有,去父类中找
3、如果父类中没有,就去父类的父类中
4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)
5、如果NSObject都没有就报错了

关于"重写父类方法"的一个细节:
1.子类重写父类的方法,相当于在调用该方法的时候覆盖了父类的方法,所以子类调用该方法,只会执行重写的方法,不会执行父类的方法
2.如果在子类重写的方法中调用父类的方法,使用super



//-------------实例变量修饰符:
作用范围:
@public(公开的) :         作用于所有的类    //   函数也适用 main()
@protected(受保护的):     作用于当前类,子类(派生类)  //默认
@private(私有的):         作用于当前类  (子类不可用)


@package(框架级别的):      作用于框架级别的


父类
@private
.h  声明了    属性   修饰成子类不可用  但是 属性的本质还是公开的
//-----------
没有在.h中声明   直接在.m中写     属性的本质 : 私有

子类
不能用
能继承  
//---------
不能用
不能继承


// ------------------ 私有属性 /  私有方法

"什么是私有属性和私有方法"
1.凡事没有声明,直接实现的      就是私有方法
2.实例变量写在实现中,没有声明   就是私有属性

"私有属性何私有方法怎么用"
3.私有属性 只能在 当前类的实现文件中使用
4.私有变量 只能在 当前类的实现文件中使用(间接的调用私有方法,借助公开的方法)

"私有属性与私有方法与子类"
5.私有属性和私有方法  不能被子类继承,没有继承就意味着子类没有拥有父类的属性与方法

"技巧------->"
6.  xcode智能提示     智能提示出现--->  意味着这个对象拥有这个实例变量/方法
                    智能提示出现但是有红线 ---> 意味着这个对象拥有这个实例变量但是不能使用
                    智能提示没有出现 --->  意味着这个对象没有这个实例变量和方法



//--------------私有变量&私有方法

私有实例变量:
@implementation <#class#>
{
   
    //定义实例变量    ---->   私有实例变量   只能在本类中使用
   
}


私有方法:
直接在.m文件中实现,没有声明


私有变量跟私有方法不能被子类继承,私有方法与私有实例变量只能在本类中使用


@end




//--------------私有变量&私有方法:
默认情况下实例变量属于@protected修饰.


私有变量定义格式:
在.m文件当中定义
@implementation Person : NSObject
{
    int  age;   //  私有变量
}

// 不在.h文件中声明,  只在.m文件中实现
-(void)run{
   
    NSLog(@"我是私有方法");
}
@end

私有方法只能在当前文件中使用,  不能被子类继承.


实现中  .m   中使用

-(void)study{
   
    [self run];
   
}

//私有方法
-(void))run{
   
   
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2