OC复习总结:
这个文件是在学习完C语言的基本用法后,回顾C语言的一些语法和易错,不易理解的一下内容,可能会存在内容不连续的情况.
本文内容,有参考自 M了个J的博客 和 lizze_yun的博客 根据自身的学习进行了部分的摘抄和扩写
原文请参考:http://www.cnblogs.com/mjios/tag/objective-c/default.html?page=1
http://blog.csdn.net/zhangyun2013?viewmode=contents
类:
命名规范:
*类名的第一个字母必须是大写
*不能有下划线
*多个英文单词,用驼峰标识
常见错误:
1.第一个错误,@interface和@implementation要分开,interface后有一个end,不能嵌套
2.方法声明写上面,实现写下面
3.如果有两个类的话,要写在第一个类的implementation后面,不能嵌套使用。interface和implementation是配套使用的
4.直接这样写: wheels=5; 错误,wheels是实例变量,只有对象才能产生
5.类的声明必须要放在主函数前面
类的成员变量,在.h文件中进行定义时,默认是@protected类型,可以在Student类内部和子类中访问
2、成员变量的常用作用域有3种:
1> @public 全局都可以访问
2> @protected 只能在类内部和子类中访问
3> @private 只能在类内部访问
方法的声明和实现:
OC方法中一个参数对应一个冒号,冒号写在参数类型前面
如: (int)sum:(int)num1 :(int)num2;
冒号也是方法名的一部分
方法名要起的有意义,标准写法:
- (int)sumWithNum1:(int)num1 andNum2:(int)num2
类的本质:
其实类也是一个对象,是Class类型的对象,简称"类对象"
Person *p = [[Person alloc] init];
1.先利用class类型创建一个Person类对象(把Person类加载进内存)
2.再利用Person类对象创建Person类型的对象
通过下面的方法可以获取类名
Class c1 = [p1 class]; 此处的c1就是内存中的Person类
类的加载和初始化
+load方法
1.当程序一启动时,就会加载项目中的所有类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次
2.先加载父类,再加载子类(先调用父类中+load方法,再调用子类的+load方法)
3.先加载原始类,再加载分类
4.不管程序运行过程中有没有用到这个类,都会调用+load方法加载
+initialize方法
1.当第一次使用某个类时,就会调用当前类的+initialize方法(使用到类,比如创建对象时)
2.先调用父类的+initialize方法,再调用子类的+initialize方法
3.优先调用分类的initialize方法
id类型:
id 是万能指针,能指向\操控任何OC对象
id类型的定义:
typdef struct objc object{
Class isa;
} *id;
注意:
1. 因为id是一种类型,所以不可以写 id id; 就像是不可以写 int int; 一样,关键字不可以做标识符。
2. id内部已经包含*了,所以在id类型后面不需要再加*了。
id类型是不可以使用点语法的,id类型是OC中独有的数据类型,在内部处理上,这个类型被定义为指向对象的指针,点语法是通过对象来调用set和get方法,id是指针,所以不可以调这两个方法。
3、在点语法的使用各种
stu.age = 10; // 等价于[stu setAge:10];
int age = stu.age; // 等价于int age = [stu age];
实际上,点语法是进行了方法的调用,并不是想C中的结构体一样直接取出对象成员变量的值
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问
@protected : 可以在当前类及其子类的对象方法中直接访问(默认就是@protected)
注意:
1.在@implementation中也可以声明成员变量,默认就是private的,就算是写了public也是没有用的。
2.@interface中声明的成员变量默认是protected的
3.@interface和@implementation不能声明同名的成员变量
4、构造方法:
目的:默认的构造方法中,不接受任何参数,不返回任何值,因此可以自定义构造方法来实现对象成员变量的初始化操作
- (id)initWithAge:(int)age;
构造方法的方法名一般都会以init开头,返回值跟init方法一样为id类型,id可以代表任何OC对象
构造方法的实现:
1 - (id)initWithAge:(int)age {
2 self = [super init]; // 调用父类的构造方法 对父类进行初始化
3 if (self != nil) {// 表示如果父类初始化成功
4 _age = age;
5 }
6 return self;
7 }
可进行适当的简化:
- (id)initWithAge:(int)age {
// 1,一定要调用回super的init方法,初始化父类中声明的成员变量和其他属性
//2.如果对象初始化成功,才有必要进行接下来的初始化
2 if ( self = [super init] ) {
//初始化成功
3 _age = age;
4 }
3.返回一个已经初始化完毕的对象
5 return self;
6 }
实例:
- //要求学生对象初始化完毕后,年龄就是10,学号就是1
- -(id)init
- {
- //此处的super就是Student的父类Person,所以是调用Person的init方法
- if (self = [super init])
- {
- //_age没有必要重写,父类中都已经设置好了,同时此处也没有权利重写,
- //因为_age在父类中是私有的,
- _no = 1; // 谁声明的变量最好有谁来进行初始化 以免重复的进行初始
- }
- return self;
- }
自定义构造方法:
初始化,成员变量:
父类 Person
- - (id)initWithName:(NSString *)name andAge:(int)age
- {
- if (self = [super init]) //父类是object
- {
- _name = name; //Person类中得两个成员变量
- _age = age;
- }
子类 student
- //父类的属性交给父类方法去处理,子类方法处理子类自己的属性 !!!
- - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
- {
- // 将name和age传递到父类方法中进行初始化
- if (self = [super initWithName:name andAge:age])
- { //子类只是声明了_no这一个成员变量因此只负责初始化这一个
- _no = no;
- }
- return self;
- }