一、
Xcode文档的安装
1). Xcode文档提供了很多框架, 框架当中有很多类和函数, 提供的一些数据类型.
2). Xcode文档需要单独安装.
a. 在线安装: Xcode-> Preferences...->Downloads->Xcode文档
b. 离线安装:
路径:/Applications/Xcode.app/Contents/Developer/Documentation/DocSets/
点击Window->Documentation and API Reference.static 关键字
1). C语言中的static
a. 修饰局部变量: 把局部变量变成静态变量
b. 修饰全局变量
c. 修饰函数
2). OC中的static
a. static不能修饰属性也不能修饰方法
b. 可以修饰方法中的局部变量
如果方法中的局部变量被static修饰, 这个变量就会被变成静态变量.存储在常量区-
self关键字
1). 方法的内部可以定义一个与类属性相同的变量, 这个时候如果在方法中访问这个同名的变量, 则访问的是局部变量.
2). self: 自己的.
和Java、C#中的this关键字有点像.
可以在对象方法和类方法中使用.
self是1个指针, 在对象方法中self指向当前对象, 在类方法中self指向当前类.
3). self用在对象方法中
a. self在对象方法中, 指向当前对象
b. 可以使用self显示的调用当前对象的属性
c. 可以使用self来调用当前对象的其他对象方法
NSLog(@"self = %p", self);
NSLog(@"_name = %s", self->_name);
[self hehe];
d. 必须使用self场景
a). 如果在方法当中存在和属性同名的局部变量,如果想要访问同名的局部变量,直接写就可以了,如果想要访问当前对象的同名属性,必须使用self
b). 在对象方法中,如果要调用当前对象的对象方法必须使用self
e. 选用self场景
如果这个时候想要访问对象的属性, 可以选择性使用.
f. 属性要求以下划线开头, 局部变量不要求以下划线开头.
4). 把self用在类方法中
a. 类加载:当类第1次被访问的时候,会将类的代码存储在代码区
b. 在类方法中, self也是一个指针,指向当前类
c. 获取类在代码段中的地址
a). 调试, 获取isa指针
b). 在类方法中查看self值
c). 调用对象的对象方法class
d). 调用类的类方法class
d. 可以用self调用本类中的其他类方法5). 对象方法可以声明多次,但只能实现一次.
对象方法和类方法可以重名.6). 注意
a. 在对象方法中可以通过self访问当前对象成员, 不能使用self调用本类中的类方法
b. 在类方法中, 可以使用self调用当前类中的其他类方法.不能使用self访问对象成员. -
继承
1). 继承的目的: 子类想拥有父类中的所有成员2). 语法
``` @interface 类名 : 父类 @end ```
3). 效果: 子类拥有了父类的所有的成员
4). 术语@interface Student : Person{ }
Student类从Person类继承,Student类是Person类的子类, Person类是Student类的父类.
5). 在新创建类模块的时候指定父类, Xcode自动完成
6). 继承是类在继承,而不是对象在继承.
创建的对象与对象之间没有任何关系.
7). 继承的时候不要乱继承.
凡是满足is a关系的类,就可以拥有继承的关系.
8). 如果有1个成员不是所有子类都拥有,那么这个成员就不应该定义在父类之中
二、
继承的特性
1). 单根性: 一个类只能有两个父类
2). 传递性: A类从B类继承,B类从C类集成-
NSObject类
是Foundation框架中的类.在这个类中有1个类方法new,这个方法是用来创建对象的,方法的返回值是创建这个对象的指针.
如果我们想要让类具备创建对象的能力,就必须直接或者间接的要从NSObject类继承.在NSObject类中,有一个属性叫isa指针.
NSObject类是OC中所有类的祖宗类. 子类不能存在和父类同名的属性.
super关键字
1). 可以用在类方法和对象方法中
2). 在对象方法中可以使用super关键字调用从父类继承过来的方法
3). 在类方法中 super关键字可以调用从父类继承过来的类方法
a. 类方法也能被子类继承, 可以使用子类调用也可以使用父类调用
b. 在子类的类方法中,可以使用super关键字调用父类的类方法
4). super不能访问属性,只能调用父类的对象方法或者类方法访问修饰符
1). 用来修饰属性,可以限定对象可以在哪一段访问
2). 修饰符
@private: 私有,仅允许本类访问
@protected: 受保护的,允许本类及子类访问
@package: 被@package修饰的属性可以在当前框架中访问
@public: 公共的,可以在任意地方访问
3). 默认属性为@protected
4). 子类可以继承子类的私有属性,只是无法访问
5). 如果父类有一个方法为属性赋值或者取值,子类可以间接的访问这个属性
6). 使用建议
a. @public 无论什么情况下都不要使用,属性不要直接暴露给外界
b. @private 如果属性只想在本类中使用不想在子类中使用,就使用她
c. @protected 本类及子类使用
d. 推荐使用默认的@protected
7). 访问修饰符只能用来修饰属性, 不能用来修饰方法-
私有属性和方法
1). @private修饰的属性叫做私有属性,只能在类的内部访问,但是在外界的时候Xcode仍然会提示这个属性,只不过没有权限访问.
2). 在@implementation中写一个大括弧,把属性定义在@implementation中做到真私有,外界无法看到。访问修饰符无效.
将属性定义在@implementation之中和将属性定义在@interface中并标记为@private的区别是提示与不提示,都不能在外界访问.
示例://实现 @implementation Person{ int num;// 真私有 } @end
3). 私有方法
方法只写实现不写声明即可做到方法私有,只能在本类的其他方法中调用,不能在外界调用 1). 里氏替换原则(LSP):子类可以替换父类的位置,并且功能不受影响
a. 父类指针迫切的需求1个父类对象,而我们给了1个对象完全没有问题,因为子类就是1个父类.
b. 因为父类中拥有的成员子类都有,所以不会影响程序的功能
2). 里氏替换原则的变现形式
a. 当1个指针指向1个子类对象的时候
3). 作用:
a. 一个指针不仅可以存储本类对象的地址还可以存储子类对象的地址
b. 如果1个指针的类型是NSObject类型的,那么这个指针可以存储任意的OC对象地址.
c. 如果一个指针数组是NSObject类型的,那么它可以存任意指针.
d. 如果一个方法的参数是一个对象,那么我们可以为这个参数传递本类对象或者子类对象
4). 当一个父类指针指向指向一个子类对象的时候,通过父类指针只能调用这个子类对象当中的成员.
5). 方法的重写
a. 直接在子类的实现中将这个方法重新实现一遍
b. 当父类指针指向1个子类对象的时候.通过父类指针调用的方法,如果子类重写了,那么调用的就是子类的方法.多态
指的是同一个行为,对于不同的事物具有完全不同的表现形式.-
description
1). %p 打印的是指针变量的值
%@ 打印的是指针指向的变量
2). 使用%@打印1个对象
输出的格式: <对象所属的类名: 对象的地址>
3). 原理
当使用%@打印1个对象的时候,NSLog的底层实现, 调用传入的对象的description方法, 拿到这个方法的返回值, 将这个字符串输出.
4). description方法是定义在NSObject类之中的.
实现: 返回的字符串格式@"<对象所属类名:对象的地址>"
5). 重写description方法(类似于Java中的toString方法)- (NSString *)description{ return [NSString stringWithFormat:@"姓名"]; }
6). 如果你希望%@打印一个对象的时候,对象的格式我们自己指定