OC学习篇之---类的初始化方法和点语法的使用
来源:互联网 发布:java string 的split 编辑:程序博客网 时间:2024/06/11 23:42
昨天介绍了OC中类的定义和使用:http://blog.csdn.net/u014010699/article/details/49906117,今天我们来继续学习类的初始化方法和点语法的使用
一、首先来看一下类的初始化方法
在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意。
下面来看一下如何自定义初始化方法:
Person.h
- //
- // Person.h
- // 03_InitDemo
- //
- // Created by jiangwei on 14-10-10.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Person : NSObject{
- NSString *_name;
- NSInteger _age;
- }
- //自定义初始化方法,必须以init开头
- - (id)initWithName:(NSString *)name withAge:(NSInteger)age;
- //打印信息
- - (void)showInfo;
- @end
注:OC中自定义初始化方法的名称必须是以init开头
在来看一下实现:
Person.m
- //
- // Person.m
- // 03_InitDemo
- //
- // Created by jiangwei on 14-10-10.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import "Person.h"
- @implementation Person
- - (id)initWithName:(NSString *)name withAge:(NSInteger)age{
- //固定写法,可以背下来哦~~
- //调用父类的初始化方法
- self = [super init];
- if(self != nil){
- _name = name;
- _age = age;
- }
- return self;
- }
- - (void)test{
- NSLog(@"test");
- }
- - (void)showInfo{
- [self test];//调用自己的方法
- NSLog(@"name is %@ and age is %d",_name,_age);
- }
- @end
同时这里还要记住一点:
以后OC中自定义初始化的方法的模板:
- //固定写法,可以背下来哦~~
- //调用父类的初始化方法
- self = [super init];
- if(self != nil){
- _name = name;
- _age = age;
- }
- return self;
下面来看一下如何使用初始化方法:
main.m
- //
- // main.m
- // 03_InitDemo
- //
- // Created by jiangwei on 14-10-10.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- //初始化方法只能调用一次
- Person *person = [[Person alloc] initWithName:@"jiangwei" withAge:22];
- [person showInfo];
- person = [[Person alloc] init];
- [person showInfo];
- //id类型,类似于void*
- //但是id类型一般不这么使用,一般会作为方法的返回值和传入的参数类型
- id person1 = [[Person alloc] initWithName:@"huangdaoyang" withAge:23];
- [person1 showInfo];
- }
- return 0;
- }
运行结果:
二、看一下OC中的点语法
OC中的点语法其实没什么高端的,但是他和Java中的那种使用对象变量直接访问public类型的变量的点是不一样的,所以这里就单独说明一下:
点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的
OC中的get方法和Java中不太一样,OC中只要一个方法有返回值都可以认为是get方法,Java中是形如getXXX这样的才叫做get方法。
下面来看一个例子吧:
Person.h
- //
- // Person.h
- // 04_UseDit
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Person : NSObject{
- //点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的
- //这里的get方法和其他语言不一样,只要有返回值就是get方法
- NSString *_name;
- NSInteger _age;
- }
- - (void)setName:(NSString *)name;
- - (void)setAge:(NSInteger)age;
- - (NSString *)name;
- - (NSInteger) age;
- //这里要注意,showInfo也是一个get方法
- - (NSString *)showInfo;
- //只定义,不实现,所以在调用[person test]的时候,编译时候不会报错
- //但是运行的时候就会报错了,因为编译的时候只会判断方法有没有定义,而运行的时候是需要判断这个方法有没有实现
- - (void)test;
- @end
同时这里要注意的是其实showInfo方法也是一个get方法,因为他又一个返回值类型。
所以在OC中使用点语法有两个条件:
1、必须是属性
2、有对应的get/set方法
下面来看一下实现吧:
Person.m
- //
- // Person.m
- // 04_UseDit
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import "Person.h"
- /**
- #import和#include的区别
- 1.当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误
- 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了
- */
- @implementation Person
- - (void)setName:(NSString *)name{
- _name = name;
- NSLog(@"setName is Execute");
- }
- - (void)setAge:(NSInteger)age{
- //这里要注意,如果我们定义的全局变量是age而不是_age的话
- //这里不能用age = age进行赋值
- //但是也不能使用self.age = age,因为self.age等价于[self setAge:age]这样就会出现死循环了
- //所以我们在定义全局变量的时候一般都会加上一个下划线以便区分
- _age = age;
- NSLog(@"setAge is Execute");
- }
- - (NSString *)name{
- NSLog(@"getName is Execute");
- return _name;
- }
- - (NSInteger) age{
- NSLog(@"getAge is Execute");
- return _age;
- }
- - (NSString *)showInfo{
- NSLog(@"showInfo is Execute");
- return _name;
- }
- @end
我们这里不能使用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
- //
- // main.m
- // 04_UseDit
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Person *person = [[Person alloc] init];
- //此处的点语法调用的是set方法,等价于[person setName:@"jiangwei"];
- person.name = @"jiangwei";
- person.age = 22;
- //此处的点语法调用的get方法,等价于NSString *name = [person name];
- NSString *name = person.name;
- NSLog(@"name is %@",name);
- name = person.showInfo;
- NSLog(@"name is %@",name);
- //调用test方法
- [person test];
- }
- return 0;
- }
运行结果:
这里需要注意的是报了一个错误,这个错误也是我们后面开发过程中经常犯的一个错误,就是这个方法没有实现,我们在Person.h中定义了test方法,但是没有在Person.m中进行实现,在main.m中进行调用就报了这个错误,但是编译的时候是没有报错的。
总结
今天就简单的介绍了OC中的初始化方法的定义和点语法的使用,其中初始化方法类似于Java中的构造方法,点语法就是get/set的缩减版
- OC学习篇之---类的初始化方法和点语法的使用
- OC学习篇之---类的初始化方法和点语法的使用
- OC学习篇之---类的初始化方法和点语法的使用
- OC学习篇之---类的初始化方法和点语法的使用
- OC学习篇之---类的初始化方法和点语法的使用
- OC学习之-----类的初始化方法的使用
- OC点语法的使用
- OC学习之@property和点语法
- OC特有的方法(点语法,)
- OC学习之点语法
- OC的点语法
- OC点语法和箭头的区别
- 黑马程序员——OC类的初始化与点语法
- 黑马程序员之ios学习总结——09 OC语言的点语法、@property和@synthesize
- OC高级语法之KVC和KVO的学习
- OC基础-类的点语法15
- 黑马程序员-----oc语言学习笔记之点语法、property、类方法
- oc中成员变量的set/get方法 以及 属性点语法的使用
- 16个OS X快捷键小技巧
- 《统计学习方法》学习笔记(一):统计学习方法概论
- 如何用c语言产生一定范围内的随机数?
- c3p0连接池,当数据源不可用时 自动跳过
- jsp是如何执行的
- OC学习篇之---类的初始化方法和点语法的使用
- 设计模式六大原则
- Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
- 原生 MySQL API--查询数据的写法
- python和numpy的版本、安装位置
- 关于mySql中的自动增长值的设置
- hdoj Cow Sorting 2838 (树状数组)
- 上线流程
- x86平台原子操作原理