黑马训练营--IOS学习---OC语言学习总结1

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后面,不能嵌套使用。interfaceimplementation是配套使用的

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中独有的数据类型,在内部处理上,这个类型被定义为指向对象的指针,点语法是通过对象来调用setget方法,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,一定要调用回superinit方法,初始化父类中声明的成员变量和其他属性

//2.如果对象初始化成功,才有必要进行接下来的初始化

2     if ( self = [super init] ) { 

//初始化成功 

3         _age = age;

4     }

3.返回一个已经初始化完毕的对象

5     return self;

6 }

实例:

  1. //要求学生对象初始化完毕后,年龄就是10,学号就是1  
  2. -(id)init  
  3. {  
    • //此处的super就是Student的父类Person,所以是调用Personinit方法  
  4.     if (self = [super init])
  5.     { 
    • //_age没有必要重写,父类中都已经设置好了,同时此处也没有权利重写,
    • //因为_age在父类中是私有的,
  6.         _no = 1;  // 谁声明的变量最好有谁来进行初始化 以免重复的进行初始
  7.     }  
  8.     return self;  
  9. }  

自定义构造方法:

初始化,成员变量:

父类 Person


  1. - (id)initWithName:(NSString *)name andAge:(int)age  
  2. {  
  3.     if (self = [super init]) //父类是object  
  4.     {  
  5.         _name = name;  //Person类中得两个成员变量
  6.         _age = age;  
  7.     }  

子类 student

  1. //父类的属性交给父类方法去处理,子类方法处理子类自己的属性  !!!
  2. - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no  
  3. {  
  4.     // nameage传递到父类方法中进行初始化  
  5.     if (self = [super initWithName:name andAge:age])  
  6.     {  //子类只是声明了_no这一个成员变量因此只负责初始化这一个
  7.         _no = no;  
  8.     }  
  9.     return self;  
  10. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值