A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pumpkin 中级黑马   /  2015-12-7 22:06  /  888 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序员—OC第四天学习总结

好吧,如标题所示,这是我对OC第四个文件夹个人认为比较重点或者是比较容易忘记的知识点进行整理,以便自己的日后复习。也希望对初学者有所帮助~

OC中的self相当于C++和java的this指针,OC提供两个保留字self和super用于在方法中定义引用执行该方法的对象。
Super发送消息可以将方法实现分发其父类。
Self应用场景:
1类方法
2对象方法
3访问成员变量
4在OC的内存管理特殊使用(就业班的课)

SELF在对象方法中
Perosn.h文件
@interface Person:NSObject
-(void)run;
-(void)eat(NSString*)foodname;
@end
Person.m文件
@implementation person
-(void)run{
NSLog(@”人在走”);
}
-(void)eat:(NSString*)foodName{
NSLog(@”人在吃%@“,foodname);
}
[Self run];//Self指代的是调用当前方法的那个对象,[p eat:@””].self 指代P
@end
Main.n
#import ”person.h“
Person *P=【person new】;//当前对象p吃东西在走(吃和走是同一对象)
【p run】;
【P eat:@“油条”】



Self在类方法中使用指代的是当前类
Perosn.h文件
@interface Person:NSObject
+(void)test;
+(void)run;
-(void)eat;
@end
Person.m文件
@implementation person
+(void)run{
  NSLog(@”人在走”);
}
+(void)test{
  NSLog(@”+test!“);
  NSLog(@”self=%p”,self);
}
-(void)eat{
[self eat];//报错,此时eat是对象方法,而self是类
}
[Self run];//Self指代的是调用当前方法的那个对象,[p eat:@””].self 指代P
@end
Main.n
#import ”person.h“
Person *p=[person new]
NSLog(@”\np=%p”,p);
NSLof(@”person=%p”,[p class]);//[p class]返回的实质就是当前的类(类对象)
[Person run];
前面两个地址是不相等的,后面两个地址相同,所以在我们类方法中使用self指代的一定不是我们当前的对象P,而是当前的类

Self修饰变量
Dog.h文件
@interface DOg:NSObject
{
int _speed;//函数内部可以定义和全局变量同名得变量,如果同名,局部变量会暂时屏蔽全局 变量的作用域
}
-(void)setspeed:(int)speed;
-(int)speed;
@end
Dog.m文件
#import “Dog.h”
@implementation Dog
-(void)setspeed:(int)speed{
_speed=speed;//两个speed都是局部
Self—>speed=speed;//self->访问的是实例变量;不加self访问的是局部变量,加上self表示访问的是类的实例变量
}
-(int)speed{
Ruturn _speed;//speed全局
}
@end
Main.m
Dog *d1=[Dog new];
[d1 setspeed:90];//set 方法写数据
NSLog(@”speed=%d”,[d1 speed//get方法读数据]);

谁调用当前方法self就指代谁

类的继承和派生
交通工具是一个基类(父类),飞机和汽车是交通工具的派生类(子类)
如何继承?
1导入要继承的那个类的头文件
2@inteface Dog:父类名(animal)
Oc里面就是单一继承,继承一个类就是单一类。
理解什么是方法的重写。
在父类继承这个方法,可能在子类是不适合的,可能在子类重写这个方法。
[Dog *d]=[Dog new];
[d eat];
先查早当前类有没有eat和bark。
如果没有查看父亲有没bark
如果父亲还没有就去爷爷
如果有就执行

访问修饰符:public(任意程序集)
            Proteced(同一类和派生类)
            Private(同一类)

子类可以继承父类所有的实例变量和方法,但是,不是所有的都可以访问。
@private类型的实例变量,可以继承但是不能访问。不写实例变量修饰符默认是@protecet

OC中的私有方法:纯私有的变量写在实现(.m)的文件中,只能在当前类中使用,既不能被子类继承也不能被子类访问。
例子:
Person.m
-(void)test{//这个方法并没有在.h文件中进行声明
NSLog(@”test!”);
}
主程序
Student *p=【student  new】;
[P test];//报错

查看对象地址:NSLog(@“d=%p”,d);
查看对象实例变量的值:用set/get语法
例子:
Dog *d=[Dog new];
[d setAge:3];
[d run];
NSLog(@”d=%p”,d);//查看对象地址
NSLog(@”%d”,[d age]);
NSLog(@”%d”,d);//打印d的对象. 结果:类名   对象的地址
               //调用了对象的description方法
               //当我们以%@的格式,打印了对象d,此时调用了对象的description方法
               //对象中如果没有重写父类的descrip方法,则调用父类的
重写父类的description这个方法:
-(NSString*)description{
Ruturn [NSString stringWithFormat:@”年龄:%d,颜色:%d,_age,_color”];
}
   
+(NSString*)description{
Ruturn [NSString stringWithFormat:@”年龄:%d,颜色:%d,_age,_color”];
//类方法中是不能访问实例变量的,所以这个是错误的

//打印类的信息,[d class]->Dog
NSLog(@“%@”,[d class]);

不要在Description里面同时使用%@和self

什么是多态?某一类事物的多种形态。
程序中的多态:不同的对象以自己的方式相应相同名称方法的能力成为多态

//用父类类型的指针指向了子类对象,这就是多态
狗 *p=[狗 new];
动物 *a=[狗 new];
多态的好处主要是简化了编程接口,它容许类和类之间重用一些习惯的命名,不用试图在一个函数中考虑所有可能的对象。

多态的条件:
1有继承关系
2有方法的重写(子类把父类的同名方法给重写了)

//使用多态
//父类指针指向子类指针
Animal *a2=【Dog new】;
[a2 run];

在多态情况下,父类执行子类特有的方法
Animal* a8=【Dog new】
【(Dog*)an6 eat】;

Animal *a8=【Animal new】
【(Dog*)a8 eat】;//这样是不行的

类的本质其实也是一个对象(类对象)
类对象在程序运行一直存在
类对象是一种数据结构,存储类的基本信息:类大小,名称,版本,消息等
类对象代表类,class代表类对象,类方法属于类对象
如果消息的接收者是类名,类方法属于类对象
类对象只能用类方法,不能用实例

Person *p=[Person new];
P是实力对象
Person也是一个对象(类对象),是class类型

Dog *d1=[Dog new];
1通过实例对象获取类对象
CLass c1=[d class];
Class c2 =[d2 class];
NSLog(@”%p”,c1);

2通过类名来获取类对象
Class c3=[Dog class];

Person *p=[Person new]
Class c1=[p class]
C1->Person
类对象的使用:
1创建实例对象:
Person *p1=[c1 new];
2调用类方法
[c1 test];


  
Person *p=[[Person alloc]init];
[p test];
寻找过程:首先把test这个方法名包装成sel类型的数据
然后sel数据找对对应方法的地址
根据方法地址调用相应的方法
注意一点:在整个过程中有缓存,一开始一个一个找,第二次使用就直接使用、

SEl其实对方法的一种包装,将方法包装成一个SEL类型的数据。
其实就是=[p test];
Person *p=[person nes];
   [p test];
SEL s1=@selector(test);
[p performselector:s1];

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马