一、首先来看一下类的初始化方法

在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意。

下面来看一下如何自定义初始化方法:

Person.h

[objc] view plaincopy
  1. //
  2. //  Person.h
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject{
  10. NSString *_name;
  11. NSInteger _age;
  12. }
  13. //自定义初始化方法,必须以init开头
  14. - (id)initWithName:(NSString *)name withAge:(NSInteger)age;
  15. //打印信息
  16. - (void)showInfo;
  17. @end

这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作

注:OC中自定义初始化方法的名称必须是以init开头

在来看一下实现:

Person.m

[objc] view plaincopy
  1. //
  2. //  Person.m
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import "Person.h"
  9. @implementation Person
  10. - (id)initWithName:(NSString *)name withAge:(NSInteger)age{
  11. //固定写法,可以背下来哦~~
  12. //调用父类的初始化方法
  13. self = [super init];
  14. if(self != nil){
  15. _name = name;
  16. _age = age;
  17. }
  18. return self;
  19. }
  20. - (void)test{
  21. NSLog(@"test");
  22. }
  23. - (void)showInfo{
  24. [self test];//调用自己的方法
  25. NSLog(@"name is %@ and age is %d",_name,_age);
  26. }
  27. @end

这里我们看到了,初始化方法返回的类型是id类型,关于OC中的id类型,可以认为和C语言中的void*是相等的,这种类型在OC中经常被用到,还有就是self关键字的使用,这里的self关键字就相当于Java中的this关键字,指代当前类对象,还有super关键字,这个和Java中的super也是一样的,指代父类对象。还有一个是nil,他就相当于Java中的null,空对象的概念,用于判断的。

同时这里还要记住一点:

以后OC中自定义初始化的方法的模板:

[objc] view plaincopy
  1. //固定写法,可以背下来哦~~
  2. //调用父类的初始化方法
  3. self = [super init];
  4. if(self != nil){
  5. _name = name;
  6. _age = age;
  7. }
  8. return self;

这个没什么好说的,就是一个模板,所以初学者就背下来吧,不过用多了,自然就记住了。

下面来看一下如何使用初始化方法:

main.m

[objc] view plaincopy
  1. //
  2. //  main.m
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. int main(int argc, const charchar * argv[]) {
  11. @autoreleasepool {
  12. //初始化方法只能调用一次
  13. Person *person = [[Person alloc] initWithName:@"jiangwei" withAge:22];
  14. [person showInfo];
  15. person = [[Person alloc] init];
  16. [person showInfo];
  17. //id类型,类似于void*
  18. //但是id类型一般不这么使用,一般会作为方法的返回值和传入的参数类型
  19. id person1 = [[Person alloc] initWithName:@"huangdaoyang" withAge:23];
  20. [person1 showInfo];
  21. }
  22. return 0;
  23. }

我们使用了我们自定义的方法实例化了一个Person对象出来,同时调用他的showInfo方法,打印结果,这里我们也会发现Person的init方法任然可以使用,这个和Java中是有区别的,其实,在上篇文章中说到过,这个init方法是NSObject父类的,可以猜想到这个方法的逻辑功能就是初始化,所以我们在自定义初始化方法的时候,都是会用到这个方法的。当然我们可以定义多个初始化方法,后面我们在介绍Foundation框架的时候,会发现系统给我提供的类有很多自定义的初始化方法。

运行结果:

二、看一下OC中的点语法

OC中的点语法其实没什么高端的,但是他和Java中的那种使用对象变量直接访问public类型的变量的点是不一样的,所以这里就单独说明一下:

点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的

OC中的get方法和Java中不太一样,OC中只要一个方法有返回值都可以认为是get方法,Java中是形如getXXX这样的才叫做get方法。

下面来看一个例子吧:

Person.h

[objc] view plaincopy
  1. //
  2. //  Person.h
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject{
  10. //点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的
  11. //这里的get方法和其他语言不一样,只要有返回值就是get方法
  12. NSString *_name;
  13. NSInteger _age;
  14. }
  15. - (void)setName:(NSString *)name;
  16. - (void)setAge:(NSInteger)age;
  17. - (NSString *)name;
  18. - (NSInteger) age;
  19. //这里要注意,showInfo也是一个get方法
  20. - (NSString *)showInfo;
  21. //只定义,不实现,所以在调用[person test]的时候,编译时候不会报错
  22. //但是运行的时候就会报错了,因为编译的时候只会判断方法有没有定义,而运行的时候是需要判断这个方法有没有实现
  23. - (void)test;
  24. @end

在{}中定义了两个属性,注意都是以下划线开头的。然后在给这两个属性定义get/set方法,这样我们就可以使用点语法来访问这两个属性了。

同时这里要注意的是其实showInfo方法也是一个get方法,因为他又一个返回值类型。

所以在OC中使用点语法有两个条件:

1、必须是属性

2、有对应的get/set方法

下面来看一下实现吧:

Person.m

[objc] view plaincopy
  1. //
  2. //  Person.m
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import "Person.h"
  9. /**
  10. #import和#include的区别
  11. 1.当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误
  12. 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了
  13. */
  14. @implementation Person
  15. - (void)setName:(NSString *)name{
  16. _name = name;
  17. NSLog(@"setName is Execute");
  18. }
  19. - (void)setAge:(NSInteger)age{
  20. //这里要注意,如果我们定义的全局变量是age而不是_age的话
  21. //这里不能用age = age进行赋值
  22. //但是也不能使用self.age = age,因为self.age等价于[self setAge:age]这样就会出现死循环了
  23. //所以我们在定义全局变量的时候一般都会加上一个下划线以便区分
  24. _age = age;
  25. NSLog(@"setAge is Execute");
  26. }
  27. - (NSString *)name{
  28. NSLog(@"getName is Execute");
  29. return _name;
  30. }
  31. - (NSInteger) age{
  32. NSLog(@"getAge is Execute");
  33. return _age;
  34. }
  35. - (NSString *)showInfo{
  36. NSLog(@"showInfo is Execute");
  37. return _name;
  38. }
  39. @end

我们看到了这里对get/set方法的实现,看到上面的注释:

我们这里不能使用self.age = age,因为self.age等价于[self setAge:age],这样就会出现死循环了

这个和Java就有很大的区别了,Java中我们是可以使用this.age = age的,而且经常这样做,但是OC中不行,原因很简单,因为OC中的点语法相当于调用set/get方法,那么在set/get方法中调用set/get方法,那就会出现了死循环了。所以这点一定要注意。

还有一个需要注意的是,刚刚在Person.h中定义了一个test方法,但是在Person.m中并没有实现,在OC中编译是不会报错的,但是运行的时候就会报错了。

看一下如何使用点语法:

main.m

[objc] view plaincopy
  1. //
  2. //  main.m
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. int main(int argc, const charchar * argv[]) {
  11. @autoreleasepool {
  12. Person *person = [[Person alloc] init];
  13. //此处的点语法调用的是set方法,等价于[person setName:@"jiangwei"];
  14. person.name = @"jiangwei";
  15. person.age = 22;
  16. //此处的点语法调用的get方法,等价于NSString *name = [person name];
  17. NSString *name = person.name;
  18. NSLog(@"name is %@",name);
  19. name = person.showInfo;
  20. NSLog(@"name is %@",name);
  21. //调用test方法
  22. [person test];
  23. }
  24. return 0;
  25. }

我们这里就可以使用点语法进行赋值和取值操作了,其实等价于调用他们的get/set方法。

运行结果:


这里需要注意的是报了一个错误,这个错误也是我们后面开发过程中经常犯的一个错误,就是这个方法没有实现,我们在Person.h中定义了test方法,但是没有在Person.m中进行实现,在main.m中进行调用就报了这个错误,但是编译的时候是没有报错的。

总结

今天就简单的介绍了OC中的初始化方法的定义和点语法的使用,其中初始化方法类似于Java中的构造方法,点语法就是get/set的缩减版

转载于:https://www.cnblogs.com/dreamDeveloper/p/6024133.html

OC学习篇之---类的初始化方法和点语法的使用相关推荐

  1. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  2. (转载)OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变 ...

  3. OC学习篇之---代理模式

    在前一篇文章我们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章我们就来介绍一下OC ...

  4. OC学习篇之---对象的拷贝

    在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来 ...

  5. OC学习篇之---归档和解挡

    今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些 ...

  6. flex 学习篇 ---- 导航类容器

    导航类容器需要使用<mx:ViewStack />.可以直接从ui设计器中拉控件过去舞台或者手动敲代码. 导航类容器就是相当于创建了一个菜单,然后按每个选项都可以进入到不同的页面. 创建了 ...

  7. (JAVA学习笔记) Scanner类中next方法和nextline方法的区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或结束符. *4. ...

  8. 手写简版spring --7--初始化方法和销毁方法

    一.目标 当我们的类创建的 Bean 对象,交给 Spring 容器管理以后,这个类对象就可以被赋予更多的使用能力.就像我们在上一章节已经给类对象添加了修改注册Bean定义未实例化前的属性信息修改和实 ...

  9. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

最新文章

  1. ^_^ 真是Android Framework的BUG
  2. virtualbox+vagrant学习-2(command cli)-16-vagrant snapshot命令
  3. 读书笔记 effective c++ Item 50 了解何时替换new和delete 是有意义的
  4. 机房工程施工细节标准做法,每张图都有说明
  5. ABAP [div '/'] 的区别与妙用
  6. 光流 | MATLAB实现HS Optical Flow(代码类)
  7. HTTP/3 来啦,你还在等什么?赶紧了解一下
  8. python下载文件的11种方式_Python 中常见的几种下载文件方法
  9. 1085 PAT单位排行 (25 分
  10. 使用ajax获取用户所在地的天气
  11. 嘉年华回顾丨 尚博带你了解腾讯 TXSQL如何 赋能腾讯云分布式数据库 CynosDB
  12. 系统学习深度学习(三十六)--Actor-Critic
  13. 自制AMD CS5536关机代码和嵌入式
  14. base64编码 vba_[VBA]Base64编码和Base64解码
  15. docker 安装Oracle-11g
  16. 船载电子海图系统(E C S )概述
  17. 记录 - Dubbo使用Zookeeper为注册中心添加认证口令时,连接失败的故障
  18. 网上宣传的0月租流量卡是骗局吗?看完你就知道了!
  19. 保持青春的秘诀是有一颗不安份的心zz
  20. 解决document.form.submit()对象不支持此属性或方法

热门文章

  1. 女生适合当程序员吗?
  2. 成为一名专业的前端开发人员,需要学习什么?
  3. 如何创建一个Mybatis程序,实现对数据库的简单查询?
  4. python urlopen错误_Python:URLError:urlopen错误[Errno 10060]
  5. matplotlib绘图_Python之matplotlib绘图示例
  6. Nginx SSI指令配置详解
  7. java bufferedreader类_详解java中的BufferedReader类
  8. tree(nyoj)
  9. Java中Lambda表达式
  10. HDU-2203-亲和串(kmp)