OC学习 第六节

                                                                               点语法和继承

NSArray *arr = nil;
NSMutableArray *arr2 = nil;
[arr sortedArrayUsingSelector:(SEL)];
[arr2 sortedArrayUsingSelector:(SEL)];
[arr2 sortUsingSelector:(SEL)];
sortedArrayUsingSelector:方法是生成一个排好序的数组并返回,
sortUsingSelector:方法是直接对原数组进行排序(当然,这个数组要是可变数组,不可变数组没有这个方法)

我们可以自己实现一个sortUsingSelector:方法。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
// … ARC: 自动引用计数 Automatic reference count
#pragma clang diagnostic pop

# 点语法 setter & getter
@property (nonatomic) int xxxx;
- (void)setXxxx:(int)xxxx;
- (int)xxxx;
自动声明setter和getter方法

@synthesize xxxx = _xxxx;
自动实现setter和getter方法
assign        直接赋值
readonly   只生成getter方法 不会产生setter
readwrite  生成setter和getter方法
atomic      原子操作  考虑线程安全
nonatomic  非原子操作  不考虑线程安全

属性操作符
一般iOS程序中,所有属性都声明为nonatomic。这样做的原因是:
在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。 atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

从xcode4.3版本开始 可以只写@property int x; 不写@synthesize x = _x;
编译器会自动的加上@synthesize x = _x;
@synthesize b = _b; 当编译器执行@synthesize这句话首先查看类的成员变量中有没有_b  如果有那么生成的setter和getter方法直接变量_b操作 如果没有那么@synthesize会自动的创建一个私有的成员变量_b,并且自动生成setter和getter方法对_b变量进行赋值和读取

id 类型不能使用点语法  但是强制类型转换之后 就可以使用


# 歌词解析
// 歌词项
// [00:16.53]你的心了无牵挂
@interface ZZLrcItem : NSObject

@property (nonatomic) float time;
@property (nonatomic, copy) NSString *lrc;

// 按时间升序排序
- (BOOL)ascendByTime:(ZZLrcItem *)item;

@end

// -------------------------------------------------------------------

@interface ZZLrcParser : NSObject

@property (nonatomic, copy) NSString *title;   // [ti:歌词(歌曲)标题]
@property (nonatomic, copy) NSString *author;  // [ar:歌词作者]
@property (nonatomic, copy) NSString *albume;  // [al:歌曲所在唱片集]
@property (nonatomic, copy) NSString *editor;  // [by:本LRC文件的创建者]
@property (nonatomic, copy) NSString *version; // [ve:歌曲的版本]

@property (nonatomic, strong) NSMutableArray *lrcItems; // 存放一个个歌词项(一项是一行)

- (instancetype)initWithFile:(NSString *)file;
- (ZZLrcItem *)lrcItemByTime:(float)second; // 根据时间(秒数)找到相应歌词项
- (NSString *)lrcStrByTime:(float)second;     // 根据时间(秒数)找到相应歌词
- (void)show;

@end


# 继承
什么是继承?
电脑 : 电器
虎 : 猫

兵 {}
特种兵 { 腰粗 … }

为什么需要继承?它有什么好处?


NSString  : NSObject

继承有什么要注意的问题?
虎 : 猫

做不到选择性继承

多继承和单继承?
龙 鹰爪 蛇身 lu角 …

驴 jiao
马 jiao
骡子:

父类   parentClass  超类 superClass    基类

子类  childClass      子类  subClass      派生类

继承的基本语法  
    继承方式
    单继承
    
    @interface 子类名:父类名
    @end

继承之后的(子类和父类)特点  
    子类可以使用父类的所有方法  
    子类可以获得父类的成员变量

    内存中继承的体现
    子类对象:包含两部分

a : b


{b的东西}
a的东西



类字段和成员方法
成员变量作用域

//一旦子类继承父类之后 那么子类就拥有了父类的所有属性和行为
/*
A:B
 c++继承方式: private 私有继承  protected 受保护继承 public 公有继承

内部变量/属性 {private protected public}
 
 OC类似 c++中 公有继承
 
 C++是多继承  可以继承多个类
 多继承缺点: 二义性
 
 OC是单继承
 
 OC怎么实现多继承  通过协议来实现
 */

OC的方法都是公有的

注意:NSString NSArray NSDictionary NSNumber NSDate 等Foundation库中的基础类不能被继承
NSString 类是不能被继承的
因为NSString NSArray NSDictionary NSNumber NSDate 等 这些类都是类簇 是不能被继承的
类簇: 设计的时候由很多子类构成,类簇的方法都是由内部的子类自己实现的
NSString 底层由很多类构成了NSString ,NSString声明的方法,都是内部的子类实现,NSString 类不实现这些方法
NSString 就像一个工厂一样 可以创建出各种各样的子类的对象

成员变量访问控制
@public 公有的 作用域:类外可以直接使用(对象指针->_height) ,类内(-)方法可以直接使用,子类继承父类之后子类(-)方法可以直接使用
@protected 受保护:类外不能直接使用但是可以通过类的方法间接使用,类内(-)方法可以直接使用,子类可以继承,子类继承父类之后 子类(-)方法可以直接使用
@private 私有:类外不能直接使用但是可以通过类的方法间接使用,类内(-)方法可以直接使用,子类不能继承父类的私有的成员变量(子类不能直接使用私有变量)

OC中有没有私有变量?有没有私有方法? 如果没有怎么实现
有私有变量 @private 修饰
OC没有像c++一样的私有方法
OC如何实现私有的???
第一种:在头文件中不声明方法,只在.m中类的实现部分实现方法
第二种:把方法声明写在匿名类别中 匿名类别写在类的实现上方 ,方法的实现仍然在类的实现部分
@interface xxx()
{
    int _age; //在匿名类别中 可以声明成员变量 默认/缺省是私有的
}

- (void)test;
// 匿名类别 可以把不公开的方法和成员变量在匿名类别中进行声明,达到私有化的目的
@end

# 继承之重写
继承之覆写(重写)override
什么是重写?
父类: - (void)exercise;
子类: - (void)exercise;

有一个概念容易和覆写混淆:重载 overload
重载和覆写不一样,重载是同一类中同名不同参的方法,比如在C++中
int sum(int, int); 和 float sum(float, float);
当调用sum(2, 3)时和调用sum(2.0, 3.5)时会根据参数的不同调用不同的方法

我们可以说oc中没有重载的概念,因为:
- (int)sumA:(int)a b:(int)b;

- (float)sumA:(float)a b:(float)b;
压根编译都不通过。

# 多态
什么是多态?
给相似的事物发送相同的消息,反应不同  —> OC多态
多态:接口相同 实现不同

c++ 父类指针指向子类调用子类重写的方法,会执行父类的,如果想执行子类的重写的方法,那么必须是虚函数,要在函数前加virtual
所以很多人认为OC的函数都是虚函数
OC是看对象不看指针
OC执行方法的过程:运行程序执行到这个方法调用的时候,首先去指针指向的对象所属的类找有没有实现方法,如果有就调用,如果没有就去父类中去找,以此类推,直到最后,如果还没有找到则崩溃

Demo 多态
不同的对象对同一消息作不同的反应
比如:殴打小动物,它们的反应情况
Class cls = NSClassFromString(name);  // String -> class

# 给父类初始化 super initWithXXX:
# 继承深入之类别的继承性
# 继承深入之再谈self和super
# 相互包含问题

作业. 设计关于宠物Pet的两个类
猫:
成员:
身高,体重
方法:
跑,跳,洗脸
狗:
成员: 身高 体重
方法: 跑,跳,摇尾巴
用尽量简单的方法创建这两个类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值