黑马程序员技术交流社区

标题: OC记录 [打印本页]

作者: 我的呸    时间: 2015-8-2 20:42
标题: OC记录
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.self和super
OC提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象。
OC语言中的self,就相当于C++、Java中的this指针。
学会使用self,首先要搞清楚属性这一概念。
设置器与访问器,提供外界操作类内部属性的一个通道。
因为类的属性,默认是@protect(受保护类型)。属性一般是私有的。
super发送消息可以将方法实现分发其父类。可以重写一个已有的方法来修改或将它添加到现有的方法中,仍然可以将原始的方法纳入到修改后的方法当中。

self的应用场景:
1)用在类方法中
2)用在对象方法中
3)访问成员变量
4)self在OC的内存管理特殊使用

self在对象方法中使用其指代的是调用当前方法的对象。
self在类方法中使用其指代的是当前类。
elf在对象方法中可以利用self->属性名称的方式访问成员变量。
self使用总结:
self 谁调用当前方法,self就代表谁
self在对象方法中,self代表当前对象
self在类方法中个,self代表类
[self 方法名称]; 调用其它方法(类方法/对象方法)
self可以简单理解为指自己
同时有对象方法和类方法存在的时候,self不会调错。

2.类的继承和派生概念

继承是指一个对象直接使用另一对象的属性和方法。
@interface Animal : NSObject{
int age;
}
-(void)run;
@end
@interface Dog :Animal{
}
-(void)LookHome;
@end

一般来说,派生类的方法属性  =  基类的属性方法 + 派生类自己新增的方法属性
1)基类的私有属性能被继承,不能被使用。
2)OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类
3)继承的合理性:
方法的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。
重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法,不会引起冲突。
从父类继承的方法,不适用于子类时,可以直接声明父类的同名方法,并定义。
不用考虑父类中方法已存在的问题。
重写后,子类可以通过super调用父类的方法。
继承的注意事项:
1)子类不能定义和父类同名的变量,但是可以继承父类的变量
2)OC类支持单一继承,不支持多继承
3)OC类支持多层继承

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

3.实例变量的修饰符

@public 任意的程序集
@protect  同类和派生类
@private 同类

1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。
2)@protected(受保护的)只能在当前类和子类的对象方法中访问。
3)@private(私有的)只能在当前类的对象方法中才能直接访问。
4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问。

变量的修饰符在子类中访问:
1)@private私有成员是能被继承,不能被外部函数访问。
2)@public公有成员能被继承,也能被外部方法访问。
3)@protected保护成员能够被继承、在子类中使用,但不能够被外部函数访问。
实例变量作用域使用注意事项:
(1)在@interface @end之间声明的成员变量如果不做特别的说明,那么其默认是protected的。
(2)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。

4.OC中的私有变量

在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,
所以在.m文件中声明的成员变量是@private的。
在.m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。
私有变量既不能看到也不能使用。
OC中的私有(相对私有)方法:
OC中并没有像Java或者其他语言中提供的私有方法,OC中的私有,可以理解为相对私有。
OC中私有方法实现有两种方式:
1)方法在.m中实现,不在.h中声明(相对私有)
2)通过匿名类别实现私有(一般意义上的私有)
@interface MyClass {
// 添加变量
}
-(void)PublicMethod;//公共方法,可以被继承类继承
@end

而在类的.m文件中,采用类别来实现私有方法,具体操作为:
@interface MyClass()//注意(),即定义一个空类别
-(void)PrivateMethod;//在类别中定义私有方法
@end






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