IOS object-c基础

2023-10-27

第一讲:OC简介及基本语法

Objective-C简称OC是在C语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,也就是可以在OC代码中混入C语言代码,甚至是C++代码。可以使用OC开发Mac OS X平台和IOS平台的应用程序。简单的介绍了一下OC,下面我们来看看OC的基本语法,学习OC之前我们先学习了C语言,因为OC是在C语言的基础上的一门开发语言,因此OC的很多基本语法跟使用方法跟C语言有类似的地方但是也有其独特的地方。

1. 关键字

OC中的关键字基本上所有的都是以@开头,但也有少数不是以@开头的,下面是一些较常用的关键字:

@interface、@implementation、@end @public、@protected、@private、@selector @try、@catch、@throw、@finally @protocol、@optional、@required、@class @property、@synthesize、@dynamic self、super、id、_cmd、__block、__strong、__weak、

2. 字符串以@开头

比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串

3. OC程序的开发过程

OC程序的开发跟C语言类似,从 .m源文件编译成 .o目标文件再链接成 a.out可执行文件

4. 程序框架

OC程序的入口也是main函数

在编写第一个OC程序时用到了OC的输出函数NSLog,但调用NSLog需要包含Foundation框架,OC中一般使用#import <Foundation/Foundation.h>来包含Foundation框架,每个框架都有自己的主头文件:即最主要的头文件。主头文件名字一般跟框架名称一样,包含了框架中的所有其他头文件,Foundation框架的主头文件名称就是Foundation.h,只需要包含Foundation框架的主头文件,就可以使用整个框架的东西。

其中#import的作用:跟C语言中#include一样,用来拷贝某个文件的内容,#import可以自动防止文件内容被拷贝多次,也就意味着头文件中不用加入相应的预处理指令。

#import <Foundation/Foundation.h>

//OC程序的入口:main函数

int main()

{

  //printf("第一个OC程序\n");//OC完全兼容C语言程序  

  NSLog(@"第一个OC程序");  //NSLog输出内容会自动换行

  return 0;

}
5. NSLog与printf的区别

NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数

NSLog输出后会自动换行,printf输出后不会自动换行

使用NSLog需要

#import <Foundation/Foundation.h>

使用printf需要

#include <stdio.h>
6. Foundation框架的作用

开发OC、iOS、Mac程序必备的框架

此框架中包含了很多常用的API(应用编程接口)

框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可:

#import <Foundation/Foundation.h>
7. BOOL的使用

BOOL类型的本质 typedef signed char BOOL;

BOOL类型的变量有2种取值:YES、NO

#define YES (BOOL)1

#define NO (BOOL)0

BOOL的输出(当做整数来用)

NSLog(@"%d %d", YES, NO);

第二讲:类和对象

OC是一门面向对象的开发语言,而C语言是面向过程的,因此在开发思想上要把面向过程和面向对象好好区分开来,体会其中的不同之处。面向过程关注的是解决问题需要哪些步骤,而面向对象关注的是解决问题需要哪些对象。

1. 类的设计

在C语言中完整的写一个函数需要函数的声明和定义(也就是实现),而OC中类似,完整的写一个类需要类的声明和实现

类的设计主要包括:类名,属性和行为

设计类名注意点:

  • 类名的第一个字母必须是大写
  • 不能有下划线
  • 多个英文单词,用驼峰标识
2. 方法(行为)的设计

OC中方法就是行为,主要包括方法名,参数,返回值(声明和实现)方法不能放在大括号里面

注意点:

  • 只要是OC对象的方法,必须以减号 - 开头,类方法以+开头
  • OC方法中任何数据类型都必须要用()扩住
  • OC方法中的小括号():只有一个作用,用来扩住数据类型
3. 类的声明跟实现

OC中类的声明值得是用来声明对象的属性跟行为,声明对象的属性(实例变量或者叫成员变量) , 成员变量默认情况下会做一个初始化,所有成员变量默认都是0

声明在@interface和@end之间进行,实现在@implementation和@end之间进行

在使用类创建对象之前,会将类加载进内存,类的内存里面只放方法列表,创建的每个对象内部默认有一个指针(isa指针),这个指针指向这个对象所对应的类,所有的对象共用相同的类里面的方法。

类的声明跟实现常见错误:

  • 只有类的声明,没有类的实现

  • 漏了@end ,@interface和@implementation嵌套

  • 两个类的声明嵌套

  • 成员变量没有写在括号里面

  • 方法的声明写在了大括号里面

语法细节:

  • 成员变量不能在{}中进行初始化、不能被直接拿出去访问

  • 方法不能当做函数一样调用

  • 成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)

  • 类的实现可用写在main函数的后面,主要在声明后面就行了

4. 方法跟函数的区别

方法:

  • 对象方法都是以减号-开头

  • 对象方法的声明必须写在@interface和@end之间

  • 对象方法的实现必须写在@implementation和@end之间

  • 对象方法只能由对象来调用

  • 对象方法归类\对象所有

函数:

  • 函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有,函数可以定义在@implementation和@end之间,这个是没有问题完全可以

  • 函数调用不依赖于对象

  • 函数内部不能直接通过成员变量名访问某个对象的成员变量

5. 方法的声明和实现
@interface JiSuanQi : NSObject

- (double)pi;   // 方法名叫pi,不带参数的方法

// OC方法中,一个参数对应一个冒号
// 方法名叫pingFang: ,要连上冒号,为了防止方法名的冲突,冒号也是方法名的一部分

- (int)pingFang:(int)num;   // 带一个参数的方法

// 方法名叫: sumWithNum1:andNum2:

- (int)sumWithNum1:(int)num1 andNum2:(int)num2; // 带两个参数的方法,可读性好 冒号前面加一些描述信息,来描述后面的参数是干嘛用的

@end

因此注意在定义方法名时要注意一些规范,保证可读性好,类似于 sumWithNum1:andNum2:这种的方法名。

第三讲:三大特性

第三讲我们主要讲OC的三大特性,OC是一门面向对象的语言,面向对象的开发语言一般共同的特点就是具有三大特性:封装,继承和多态。下面我们来学习一下OC的三大特性。

一、 封装

封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能。

封装的好处:过滤不合理的值,屏蔽内部的赋值过程,让外界不必关注内部的细节。

1. set方法和get方法

set方法

作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤

命名规范:

(1)方法名必须以set开头

(2)set后面跟上成员变量的名称,成员变量的首字母必须大写

(3)返回值一定是void

(4)一定要接收一个参数,而且参数类型跟成员变量类型一致

(5)形参的名称不能跟成员变量名一样

get方法

作用:返回对象内部的成员变量

命名规范:

(1)肯定有返回值,返回值类型肯定与成员变量类型一致

(2)方法名跟成员变量名一样

(3)不需要接收任何参数

2. 成员变量的命名规范:一定要以下划线 “_” 开头

作用:

让成员变量和get方法的名称区分开

可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量

3. 经典错误
#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

int main()

{

    Person *p = [Person new];

    // OC是在运行过程中才会检测对象有没有实现相应的方法

    [p test];//实现中没有test方法

    return 0;

}

报错:-[Person test]: unrecognized selector sent to instance 0x7fd2ea4097c0

给Person对象发送了一个不能识别的消息:test

4. 类方法和对象方法

(1)对象方法:

*减号 - 开头

*只能由对象来调用

*对象方法中能访问当前对象的成员变量(实例变量)

(2)类方法:

*加号 + 开头

*只能由类(名)来调用

*类方法中不能访问成员变量(实例变量)

(3)类方法的好处和使用场合:

*不依赖于对象,执行效率高

*能用类方法尽量用类方法

*场合:当方法内部不需要使用到成员变量时,就可以改为类方法

*可以允许类方法和对象方法同名

5. self关键字

self关键字是个指针,self指向方法调用者,代表着当前对象,当成员变量和局部变量同名时,采取就近原则,访问的是局部变量,用self访问成员变量,区分同名的局部变量

self用途:

(1)谁调用了当前方法,self就代表谁,(指向了当前对象-方法调用者)

* self出现在对象方法中,self就代表对象

* self出现在类方法中,self就代表类

(2)在对象方法中利用“self->成员变量名”访问当前对象内部的成员变量

(3)[self 方法名] 调用当前对象的某一个方法,可以调用其他对象方法或者类方法

常见错误:

*低级错误:用self去调用函数

*类方法中用self调用对象方法,对象方法中用self调用类方法

*self死循环

二、 继承

继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。继承的一些专业术语:父类\超类:superclass 子类:subclass\subclasses

1.继承的好处:

*抽取重复代码

*建立了类之间的关系

*子类拥有父类中的所有成员变量和方法

*注意点:基本上所有类的根类是NSObject

2. 方法的重写

重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

注意:

*父类必须声明在子类的前面,实现可以放在子类的后面

*子类不能拥有和父类相同的成员变量

*调用某个方法时,优先去当前类中找,如果找不到,去父类中找

*坏处:耦合性太强:类之间的关系太紧密了,当某个父类不见了,子类就用不了

3. 继承的使用场合

当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类

4. 继承和组合

当某个类想拥有另一个类当中的东西,考虑两种方式,一种是继承一种是组合

继承:xx 是 xxx 代表什么什么(子类)是什么什么(父类)

组合:xxx 拥有 xxx

类A

{

  int _age;

  int _no;

}

类B

{

  A *_a; // B里面拥有A,这个是组合

  int _weight;

}

在实际的使用中,要注意逻辑和设计,区分好继承和组合的使用。

5. super关键字

super的作用和使用场合:

*直接调用父类中的某个方法

*super处在对象方法中,那么就会调用父类的对象方法

*super处在类方法中,那么就会调用父类的类方法

*使用场合:子类重写父类的方法时想保留父类的一些行为

三、 多态

多态指的是某一类事物的多种形态,OC对象具有多态性

多态的体现:Person *p = [Student new]; p->age = 10; [p walk];

1. 多态的使用注意

*没有继承就没有多态

*代码的体现:父类类型的指针指向子类对象

*好处:如果函数\方法参数中使用的是父类类型,可以传入父类,子类对象

*局限性:父类类型的变量 不能 直接调用子类特有的方法。必须强制转为子类类型的变量后,才能直接调用子类特有的方法。

2. 代码中的注意点
Animal *a = [Dog new];

//[a run];run方法为Dog独有,不能直接访问
Dog *d = (Dog *)a;//强制转换为Dog *类型才能调用run方法

[d run];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOS object-c基础 的相关文章

  • Hough变换原理

    Hough变换原理 NEU icerain 2007 6 25 一 简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一 Hough变换的基本原理在于利用点与线的对偶性 将原始图像空间的给定的曲线通过曲线表达形式变为参数空
  • ffmpeg 剪辑 剪切 一段 视频 windows中

    从视频的14分钟44秒处 剪10秒钟视频 存为 output mp4 文件 ffmpeg ss 00 14 44 t 00 00 11 i H BaiduNetdiskDownload xialuotefannao mp4 vcodec c
  • 分布式最小生成树算法

    分布式最小生成树算法 作为分布式算法中的经典算法之一 GHS分布式最小生成树算法的相关资料却并不多见 相关的原理介绍只是范范而谈 代码实现也比较少见 本文将汇总目前网络上可查阅的相关参考资料并结合自己的理解 旨在深入理解GHS的算法核心与实
  • 【起航】目标检测的里程碑R-CNN通俗详解

    前面我们学习了目标检测中常用的评价指标以及传统的目标检测思路 如下 目标检测中常用的评价指标传统目标检测思路 为了系统的学习 以及形成一个完整的知识体系 所以接下来我们逐步深入学习常见的目标检测模型 后面常见模型的学习顺序大致为R CNN
  • 解决dnd-kit点击事件和拖拽事件的冲突

    dnd kit https github com clauderic dnd kit 在使用dnd kit作为拖拽库时 可能会遇到拖拽的组件中包含可交互的组件 例如一个input或者button 当绑定上事件之后 例如click 这时浏览器
  • docker学习:网络连通

    这里主要就是使用docker connect命令来做网络连通 在这里插入图片描述 docker network命令也看一下吧 docker run d P name tomcat net 01 net mynet tomcat 测试两个不同
  • Vue-动画效果

    vue动画效果 vue中动画效果是很简单的一个东西 vue帮助我们做了一些动画封装 同时也支持自定义动画 过度 第三方库 这些方式都可以实现 我们一一举例说明 注意 下面的相关截图 由于不是gif动图 所以展示的并不全面 1 编写案例 首先
  • ROS的安装教程(noetic版本)

    笔者当时学习ROS时在安装ROS的时候花了一些功夫 现在回过头希望能对初入ROS的大家一些帮助 先为大家附上ubuntu20 04的清华下载源 下载后缀 iso的 点击跳转 1 配置ubuntu的软件和更新 首先打开 软件和更新 对话框 打
  • 广州数控车床M代码指令讲解

    辅助功能 M 功能 代码及其含义如果在地址M后面指令了2位数值 那就把对应的信号送给机床 用来控制机床的ON OFF M代码在一个程序段中只允许一个有效 M代码信号为电平输出 保持信号 M代码说明M03主轴正转M04主轴反转M05主轴停止M
  • angularjs使用文档

    ng directives ng app 指令 定义一个 AngularJS 应用程序 ng app myModule ng model 指令 把元素值 比如输入域的值 绑定到应用程序 双向绑定
  • 此url不支持http方法get_http协议(三)几种数据传输方式

    参考 老张http协议 三 几种数据传输方式 http协议的一些特点 1 无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议 即无状态协议 这种设置的好处是 更快的处理更多的请求事务 确保协议的可伸缩性 不过随着web
  • [机缘参悟-75]:谈谈“玻璃心”与“钝感力”

    目录 何谓 玻璃心 呢 钝感力 1 不要做毫无根据的猜想 2 学会从多个角度看问题 3 常常剖析自己的内心 4 感谢周遭的嫉妒和嘲讽 5 提高适应环境的能力 6 树立强势文化思维 7 修炼自己的自我觉知的层次 何谓 玻璃心 呢 从字面意思上
  • 冒泡排序 Bubble Sort

    冒泡排序 Bubble Sort 基本概念 冒泡排序的实现 时间复杂度 和 空间复杂度 稳定性 冒泡排序优化 基本概念 不断比较相邻的两个数 如果大于右边的数就交换 swap 直到末尾 这样最后一个元素就是最大的数 重复n次 排序完成 Ex
  • Learning to Navigate for Fine-grained Classification 论文学习

    Learning to Navigate for Fine grained Classification 论文地址 参考博客 介绍 问题描述 细粒度分类任务是用来区分上一级公共类的子类 例如野生鸟类 汽车型号 这些子类通常是由各个领域专家根
  • Qt——打开QT项目时只有.pro文件,头文件、源文件都不见了(涉及高低版本Qt的Kits工具,Could not find qmake spec ‘default‘.Error while par

    注意 若转载 请贴上链接 https blog csdn net qq 41042595 article details 126244047 如若发现抄袭或未标明来源现象 都可举报反馈 文章目录 前提 问题的由来 问题分析 回想 解决方案
  • C# JSON解析

    根据节点一层一层寻找 如果节点包含数组 则用JArray来访问 根据节点寻找 public string GetJsonResult string JSON string Result new string 2 JObject MyJObj
  • Linux 文件权限

    目录 1 查看文件权限 2 rwx 的意义 3 改变文件属性与权限 3 1 rwx 与 421 3 2 改变文件权限 chmod 3 3 改变文件所属组群 chgrp 3 4 改变文件所有者 chown Linux下一切皆文件 Linux中
  • python爬虫之模拟登录

    最近应朋友要求 帮忙爬取了小红书创作平台的数据 感觉整个过程很有意思 因此记录一下 在这之前自己没怎么爬过需要账户登录的网站数据 所以刚开始去看小红书的登录认证时一头雾水 等到一步步走下来 最终成功 思路通了感觉其实还是很简单 解决思路 一
  • 【课程作业经验】基于MIndSpore波士顿房价数据预测

    基于mindspore实现全连接网络的波士顿数据集房价预测 北京理工大学邱小尧 写本次帖子是基于机器学习实践课程完成的相关使用mindspore深度学习框架完成的任务 写一些分享心得 本次实验我们预采用mindspore进行 数据导入与准备
  • python学习之10行代码制作炫酷的词云图(匹配指定图形形状)

    文章目录 前言 一 需要准备什么 二 代码实现 示例 三 读入数据 四 结果展示 五 修改词云颜色后的运行结果展示 总结 前言 想必大家有一个问题 什么是词云呢 词云又叫名字云 是对文本数据中出现频率较高的 关键词 在视觉上的突出呈现 形成

随机推荐

  • 使用nrm 方式 管理npm 仓库

    管理npm的仓库的方式有很多种 使用nrm 也是比较推荐的一个方式 官网链接 大概说一下常用的命令 npm install g nrm 全局安装nrm 安装之后我们可以查看有哪些仓库 nrm ls http t zoukankan com
  • 首款国产操作系统面世,比Windows更美观,个人用户永久免费

    本文来自洞见网http www localonline com cn 文章链接 http www localonline com cn kuaibao 921 html 转载请注明出处 说到电脑操作系统 基本上所有人想到第一个名字肯定是Wi
  • 通过 node 创建 web 服务器 (Vue项目上线优化 七)

    通过node创建服务器 在vue shop vue shop是项目文件夹名 同级创建一个文件夹vue shop server存放node服务器 使用终端打开vue shop server文件夹 输入命令 npm init y 初始化包之后
  • springboot整合mybatis之二:mapper.xml文件位置

  • 深度学习总结(一)各种优化算法

    参考博文 码农王小呆 https blog csdn net manong wxd article details 78735439 深度学习最全优化方法总结 https blog csdn net u012759136 article d
  • 矢量vector之间用等号赋值的问题

    结论 可以 在程序上编个小程序试试就能知道了 vector v1 v1 pushback 2 v1 pushback 3 v1 pushback 4 vector v2 v1 cout lt lt v2 0 lt lt v2 1 lt lt
  • StringUtils 工具类 详细介绍

    https blog csdn net laukicn article details 69230022
  • Java 程序员,真的不能去外包吗?

    Java程序员是可以去外包的 外包公司通常会为客户提供技术服务 包括程序开发 系统维护和支持等 作为Java程序员 如果你有较强的Java技能 那么可以考虑去外包公司工作 在外包公司工作的优势包括 有机会去不同的客户处工作 能够更多地接触不
  • shell 脚本day4之 sed应用

    应用sed编写的点名器 root zabbix server day4 more name txt 李白 杜甫 白居易 孟浩然 苏轼 root zabbix server day4 more roll sh bin bash 功能描述 De
  • 用js实现滚动加载动画效果

    目录 一 效果图 二 代码部分 1 html结构 2 css样式部分 3 js部分 三 代码总结 一 效果图 可以看出 在悠方滚动条滚动的时候 当高度打到一定高度的时候就会出现一个div盒子 就好像刚加载出来一样 而且可以一直向下滚动 二
  • github 中使用 ssh

    从去年开始 github 对于 https 方式下载的仓库已经不支持直接 commit push 等操作 由于 https 方式简单快捷 对于大部分只是对 git 初步熟悉的用户来说是非常合适的 因为不需要做任何配置 只需要一个 githu
  • js之DOM0级和DOM2级绑定事件

    js原生注册事件分别为DOM0级 DOM2级 DOM0级事件 简单理解就是直接绑定 可以是直接在标签中绑定事件
  • LVGL笔记8--lv_style样式

    LVGL笔记8 lv style样式 样式是用来修饰UI美观性 使用lv style对UI界面进行重绘和重用 利用多个不同的样式来形成Theme对象 对于vl obj基础对象而言 每个对象都有一个lv style样式 但对于其他的控件 比如
  • 基于Java+SpringBoot+vue的社区报修维修平台(含源码和数据库)

    文章目录 简介 环境需要 住户前台功能模块 管理员功能模块 住户后台功能模块 维修员后台功能模块 简介 系统管理也都将通过计算机进行整体智能化操作 对于社区维修平台所牵扯的管理及数据保存都是非常多的 例如住户管理 社区公告管理 维修工管理
  • 目标检测笔记(十三): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程))

    文章目录 一 目标检测介绍 二 YOLOv5介绍 2 1 和以往版本的区别 三 代码获取 3 1 视频代码介绍 四 环境搭建 五 数据集准备 5 1 数据集转换 5 2 数据集验证 六 模型训练 七 模型验证 八 模型测试 九 评价指标 一
  • Jupyter Notebook 添加代码自动补全功能

    自己记录以便后期参考与查询 转载参考 https www jianshu com p 0ab80f63af8a 安装 如果之前安装过显示目录功能的话 这一步骤可以跳过 pip install jupyter contrib nbextens
  • 【测试 2】二、软件质量与软件测试过程

    2 软件质量 2020年10月29日01 16 39 质量三要素 实体 特性 需求 软件质量6大特性 27个子特性 参考 https www cnblogs com jodyccf p 12200325 html 软件质量活动 保证软件质量
  • 认识RAID磁盘阵列

    认识RAID磁盘阵列 前几天在公司整理办公桌时找到了一份关于RAID的文档 对RAID介绍的很详细 这几天我利用空闲时间把这份文档录入到了电脑里 现分享给大家 认识RAID磁盘阵列 廉价冗磁盘阵列 Redundant Array of In
  • 运放使用总结篇(1) 运算放大器基本概念简介

    文章目录 前言 一 运算放大器是什么 二 运放的开环增益 三 运放的输入阻抗 输出阻抗 四 运算放大器的基本结构 五 运放的开环和闭环使用 总结 前言 作为硬件设计中最常用的运算放大器 有必要了解和掌握 单个三极管放大倍数离散度很大 虽然硬
  • IOS object-c基础

    第一讲 OC简介及基本语法 Objective C简称OC是在C语言的基础上 增加了一层最小的面向对象语法 完全兼容C语言 也就是可以在OC代码中混入C语言代码 甚至是C 代码 可以使用OC开发Mac OS X平台和IOS平台的应用程序 简