02OC的类和对象
这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#、Java等没有那么多的语法特性,所以差别还是比较大的。
一、类的定义
在C#中定义一个类是很简单的,直接加class关键字和一对大括号就完成了,然而,我们在OC定义一个Person类看看。
1.在Xcode中,点击File->New File
2、选择CoCoa下的Object-C Class
3、输入类名Persion,选父类为NSObject、点击Next
4、好了,我们可以看到项目多了两个文件:一个为Persion.h、一个Persion.m
其中,Persion.h是类的声明文件,Persion.m是类的实现文件
默认情况下,这两个文件类名要一致
编译器只会编译.m文件,不会编译.h文件
两个文件的分析
在OC中定义一个类需要两个文件 .h和.m:
Persion.h文件:
- #import <Foundation/Foundation.h>
- @interface Persion : NSObject
- @end
1、放类的声明(成员变量、属性、以及方法的声明)。
2、@interface关键字表示声明一个类,要以end结束,@interface和@end是配套使用的。
3、NSObject是OC的基类,所有的类最终都继承于这个类(但是需要注意OC中的基类并不只有一个,例如NSProxy也是OC的基类),由于这个类在Foundation框架中定义,所以导入了<Foundation/Foundaton.h>(这么描述的意思是导入Foundation框架中的Foundation.h声明文件)。
- #import "Persion.h"
- @implementation Persion
- @end
Persion.m文件:
放属性、方法的具体实现,关键字@implementation用于实现某一个类,同时必须以@end结束,在这两个关键字之间可以放具体的属性、方法;由于.m文件使用了Persion类,所以需要导入它的声明文件Persion.h,如果不引用它肯定会报错,因为它根本不知道Persion是什么东西。
二、成员变量
一般情况下,我们习惯下把成员变量定义在头文件(.h文件)中
下面我们定义几个成员变量
- #import <Foundation/Foundation.h>
- @interface Persion : NSObject
- {
- NSString *_name;
- int _age;
- @public float _height;
- }
- @end
注意点:
1.成员变量必须定义在类后面的{}中
2.成员变量不指定任何关键字的话是默认的级别是@Protect
3.注意在OC中不管是自定义的类还是系统类对象,都必须是个指针,例如 _name
4.在OC中推荐成员变量以_开头
可访问级别有以下几种:
@private 私有成员(当前类可以访问)
@protected 受保护的成员(只有当前类或者子类可以访问,默认)
@public 公共成员(任何类都可以访问)
@package(不太常用,类似C#的internal,在框架内是公共的,在框架外是公共的)
那既然_height是公共的,我们怎么访问它呢?
这里需要注意几点:
1、OC的所有对象类型都需要加上*,在OC中对象其实就是一个指针,例如之前看到的NSString也是如此,但是基本类型不用加*
2、OC中使用[]进行方法的调用,方法调用的本质就是给这个对象或者类发送一个消息
3、OC中对象的实例化有两个步骤:
1是给对象对象分配存储空间;
2是初始化对象;
4、类的初始化会调用父类的init方法,如果使用默认初始化方法进行初始化(指的是不带参数的构造函数),这两个步骤可以简写成[Persion New]
5、公共成员的调用使用->操作符
三、方法和属性
用过C#、Java的童鞋应该都知道,属性本质上来说就是Get、Set两个方法。所以方法和属性,其实是同一个事。
下面我们看下声明方法的方式:
实现方法的方式:
以上不多说,虽然写法上有差别,但是应该看一下都懂的。
在OC中方法分为静态方法和动态方法,不多说区别。方法前面加-的话,表明这个方法是动态方法,+表示为静态方法。
如果一个方法在.h文件没有定义的话,说明是私有方法,外部无法访问。
方法具体的调用方式:
上面介绍了方法的调用,以及p.name这是对应属性的简写调用形式,其实这就是OC提供的一种语法糖,让我们更像C#或者JAVA那样更方便的去调用属性。俗称:OC的点语法
好了,我们看到属性的定义以及调用了。但是每个属性都这样写,是不是很麻烦呢?有没有例如C#中prop简单点的方式呢?答案是肯定有的。
1、在.h文件需要用关键字@property去声明
2、在.m文件需要用关键字@synthesize去是实现
总结下调用方式:
1.声明了属性a,也使用了@synthesize a进行实现:但是实现过程中没有指定使用的成员变量,例如上面的两个例子,这时候编译器会使用a作为属性的成员变量(如果定义就使用定义的,没有定义就自动生成一个成员变量a,注意这个时候定义的_a跟它就没有关系了);
2.声明了属性a,使用@synthesize a=_a:这个过程就已经指定了使用的成员变量,此时会使用指定的作为属性变量。
3.声明了属性a,不使用@synthesize实现:编译器会使用_a作为属性的成员变量,跟这个a是没关系的。(比较拗口)
其实在项目开发中,我们要么在@property中声明不使用@synthesize,要么使用过程中指定具体的成员变量。其实最终还是会生成getter/setter方法,只不过编译器帮我们完成了。
总结:好了,这章主要讲OC中类、以及类中的成员变量的声明和调用。下一节我们再看看类中的其他东西,例如继承、构造函数等等东西。
02OC的类和对象的更多相关文章
- Java编程里的类和对象
像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...
- Python - 类与对象的方法
类与对象的方法
- C++基础知识(5)---类和对象
终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- 前端学PHP之面向对象系列第一篇——类和对象
× 目录 [1]类 [2]成员属性[3]成员方法[4]对象[5]成员访问[6]this 前面的话 面向对象程序设计(OOP)是一种计算机编程架构.计算机程序由单个能够起到子程序作用的单元或对象组成,为 ...
- Objective-C Runtime 运行时之一:类与对象
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- [Java入门笔记] 面向对象编程基础(一):类和对象
什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- swift基础:第六部分:类与对象
http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...
随机推荐
- java1.8函数式接口
package com.wzy.t1; @FunctionalInterface//此注解用来声明此接口为函数式接口 public interface People { /** * 1.函数式接口只能 ...
- Python 过算符和数据类型
一.算术运算符 二.逻辑运算符
- [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环
题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...
- [ASP.NET 5]终于解决:Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll'
11月12日,惊喜地发现SqlClient(System.Data.SqlClient.dll)跨平台了(对应的nuget包包是runtime.unix.System.Data.SqlClient), ...
- matlab 将多个盒图放在一张图上
1.boxplot 将多个盒图放在一张图上 x1 = normrnd(5,1,100,1)';x2 = normrnd(6,1,200,1)';X = [x1 x2];G = [zeros(size( ...
- CentOS6.5_64位系统下安装配置postfix邮件系统 启用并配置SMTP在第三方上边使用发送邮件
一前言 本来使用qq邮箱发送邮件,然后借助sendEmail来发送邮件告警,但是有每天的200封限制,很是不爽,于是想到来自己搭建邮件服务器来解决这个问题,关于使用sendEmail来借助qq邮箱来发 ...
- Asp.Net MVC<三> : ASP.NET MVC 基本原理及项目创建
MVC之前的那点事儿系列 解读ASP.NET 5 & MVC6系列 MVC模拟(摘自ASP.NET MVC5框架揭秘) Asp.net中,通过HttpModule的形式定义拦截器,也就是路由表 ...
- 不可错过的javascript迷你库
最近看着下自己的github star,把我吓坏了,手贱党,收藏癖的我都收藏了300+个仓库了,是时候整理一下了. Unix主张kiss,小而美被实践是最好用的,本文将介绍笔者收集的一些非常赞的开源库 ...
- poi导出的excel的数字小数位过多?
最近在使用Apache的POI组件对Excel进行操作,在对excel导出的时候,导出的数字本来只有两位小数,得到的结果就变成了很多位小数.如下面的图所示: 虽然对单元格使用了setCellStyle ...
- fedora22命令useradd,groupadd等命令不能自动补全
sudo ls -l /sbin/useradd 发现登陆账户没有读权限 修改为其他账户为读权限即可