oc语言_c语言如何实现ocr - CSDN
精华内容
参与话题
  • OC语言之Objective-C简介

    千次阅读 2016-07-17 21:21:12
    # Objective-C简介 !...##1.Objective-C简介 - Objective-C是一种面向对象的计算机...- 1986年,Brad Cox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言。 - 1985年,被赶出苹果公司的S

    # Objective-C简介

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/qbs.png)

    ##1.Objective-C简介

    - Objective-C是一种面向对象的计算机语言

    - 1986年,Brad Cox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言。

    - 1985,被赶出苹果公司的Steve Jobs成立了NeXT公司,致力于开发强大且经济的工作 站。NeXT选择Unix作为其操作系统

    - 1988Steve Jobs获得了Objective-C的使用版权,使用Objective-C来编写NeXTSTEP操作系统 , Objective-C使得设计NeXTSTEP操作系统更加容易

    - 1994,NeXTSun共同制定OpenStep API标准,其中两个重要的部分是Foundation跟 Application Kit,此时开始使用命名前缀NS

    1995,NeXTStepstone得到了Objective-C全部版权

    - 1996  Steve Jobs重回苹果公司,OpenStep用于 Mac OS X操作系统开发,它的版本和开发环境叫Cocoa,使用 Objective-C作为基础语言,开发工具XcodeInterface Builder

     2007 苹果公司推出Objective-C 2.0,Objective-CMac OS X和 iOS开发的基础语言。

    ##2. Objective-C发展现状

    - 1986年,BradCox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言。

    - 1985,被赶出苹果公司的Steve Jobs成立了NeXT公司,致力于开发强大且经济的工作 站。NeXT选择Unix作为其操作系统

    - 1988Steve Jobs获得了Objective-C的使用版权,使用Objective-C来编写NeXTSTEP操作系统,Objective-C使得设计NeXTSTEP操作系统更加容易

    - 1994,NeXTSun共同制定OpenStep API标准,其中两个重要的部分是Foundation跟 Application Kit,此时开始使用命名前缀NS

    1995,NeXTStepstone得到了Objective-C全部版权

    - 1996  Steve Jobs重回苹果公司,OpenStep用于 Mac OS X操作系统开发,它的版本和开发环境叫Cocoa,使用 Objective-C作为基础语言,开发工具XcodeInterface Builder

    - 2007 苹果公司推出Objective-C2.0,Objective-CMac OS X和 iOS开发的基础语言。

    - Objective-C编程语言排名

        + 2009年 排名32

        + 2010年 排名8

        + 2011年 排名6

        + 2014年 排名3

        + 2015年 排名4(因为Swift一直在上升)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150527_1.png)

        + > 编程语言排名网站: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

    ##3. Objective-C语言学习路线及重难点

    # OCC对比

    ##1.源文件对比

    - C语言中常见源文件.h头文件,.c文件

    |文件扩展名|源类型|

    |---|---------------------------------------|

    |.h|头文件,用于存放函数声明|

    |.c|C语言源文件,用于实现头文件中声明的方法|

    - OC中的源文件.h头文件,.m.mm的实现文件

    |文件扩展名|源类型|

    |---|----------------------------------------------------------------|

    |.h|头文件,头文件包含类、方法、属性的声明。|

    |.m/.mm|类的实现文件,参与编译的文件,用来实现类中声明的方法|

    ##2.关键字对比

    - C语言的关键字都可以在OC源程序中使用

    - OC新增的关键字在使用时,注意部分关键字以"@"开头

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/gjzdb.png)

    ##3.数据类型对比

    - C语言数据类型

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/数据类型.png)

    - OC数据类型

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/数据类型2.png)

    |类型|描述|

    |---|----------------------------------|

    |BOOL|只有两个取值真和假|

    |NSObject *|OC中的对象类型|

    |id|动态对象类型,万能指针|

    |SEL|选择器数据类型|

    |block|代码块数据类型|

    - OC中的类

        + Objective-C是一种面向对象的语言,定义类是它的基本能力。

        + 那什么是类呢?类是用来描述对象的,它是一系列方法和属性的集合

        + Objective-C的类声明和实现包括两个部分:接口部分和实现部分。

        + 想要定义方法也就C语言中的函数,那么就必须先有类的存在

    ##4.流程控制语句对比

    - C语言中使用的流程控制语句OC中都可以应用

    if 语句

    switch语句

    while语句

    dowhile语句

    for语句

    break关键字

    continue关键字

    增强for循环,用于快速迭代数组或者集合

    - C语言for循环

    for (int i = 0; i < 10; i++){

        printf(“%d”,i);

    }

    - OC增强for循环

    for (NSString * name in NSArray){

        NSLog(@”%@”,name);

    }

    ##5.函数(方法)定义和声明对比

    - C语言中函数的声明和实现

        + 函数声明:int sum(int a,int b);

        + 函数实现:int sum(int a,int b){  return a+b; }

    - OC中的方法

        + 方法声明:- (int)sum:(int) a andB:(int) b;

        + 方法实现:- (int)sum:(int) a andB:(int )b{ return a+b; }

    注意方法只能写在类里面而函数可以写在任何地方

        + 对象方法,使用对象调用的方法

        + 类方法,使用类名调用的方法

    对象方法

    - (id)initWithString: (NSString * )name;

    类方法

    + (MyClass *)createMyClassWithString: (NSString *)name;

    ##6.面相对象新增特性

    封装性

    继承性

    多态性

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/mxdx.png)

    ##7.面向对象新增语法

    属性生成器

        + @property

        + @synthesize

    //声明属性

    @property (nonatomic,strong)NSString * name;

    //合成属性

    @synthesize name = _name;

    分类

        + 分类与继承

        + 使用分类扩展类,无需子类化

    @interface NSString (MyNSString)

    - (NSString *) encryptWithMD5;

    @end

    协议

        + 使用协议声明方法

        + 协议类似于C#java中的接口

    @protocol MyProtocol

    - (void)myProtocolMethod;

    @end

    - Fundation框架

        + 创建和管理集合,如数组和字典

        + 访问存储在应用中的图像和其他资源

        + 创建和管理字符串

        + 发布和观察通知

        + 创建日期和时间对象

        + 操控URL

        + 异步执行代码

    ##8.新增异常处理

    用于处理错误信息

    格式:

        + @try .... @catch .... @finally

    示例

    //创建对象car

    Car *car = [Car new];

    @try {

    //调用一个没有实现的方法

    [car test];

     }@catch (NSException *exception) {

           NSLog(@"%@",exception.name);

    }@finally {

     NSLog(@"继续执行!\n");

    }

    第一个OC程序

    ##本小节知识点

    ##1.如何创建Objective-C项目

    创建工程

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150512_3.png)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150512_4.png)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150527_8.png)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150527_9.png)

    查看结果运行结果

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150527_11.png)

    ##2.#import#include区别

    - \#import#include的类似,都是把其后面的文件拷贝到该指令所在的地方

    - \#import可以自动防止重复导入

    - \#import <> 用于包含系统文件

    - \#import用于包含本项目中的文件

    - \#import <Foundation/Foundation.h>, 告诉编译器找到并处理名为Foundation.h文件,这是一个系统文 件,#import表示将该文件的信息导入到程序中。

    框架地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneO S.sdk/System/Library/Frameworks/

    ##3.NSLog printf区别

    - NSLogFoundation框架�供的Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出。

        + NSLog传递进去的格式化字符是NSString的对象,而不是char *这种字符串指针

        + NSLog输出的内容中会自动包含一些系统信息

        + NSLog输出的内容会自动换行

    - NSLog声明在NSObjCRuntime.h

        + 声明:void NSLog(NSString *format, ...);

    NSLog(@this is a test); //打印一个字符串

    NSString *str = @"hello xiaomage!”;

    NSLog(@"string is:%@",str);//使用占位符,%@表示打印一个对象,%@ OC特有的

    NSLog(@"x=%d, y=%d",10,20);//使用多个占位符,%d表示整型数

    ##4.@”的使用方法

    OC中“@”有特殊的用法

        + @"" 这个符号表示将一个C的字符串转化为OC中的字符串对象NSString.

        + @符号 OC中大部分的关键字都是以@开头的,比如@interface,@implementation,@end @class等。

    ##5.NS前缀

    - NS来自于NeXTStep的一个软件 NeXT Software

    - OC中不支持命名空间(namespace)

    - NS是为了避免命名冲突而给的前缀

    看到NS前缀就知道是Cocoa中的系统类的名称

     

    面向对象思想

    软件编程就是将我们的思维转变成计算机能够识别语言的一个过程

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/mxdxsx.png)

    ##1.面向对象基本概念

    面向对象(Object Oriented,OO)是软件开发方法

    面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

    - Object Oriented Programming-OOP ——面向对象编程

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/mxdxkf.png)

    ##2.面向对象和面向过程区别

    面向对象是相对面向过程而言

    面向对象和面向过程都是一种思想

    面向过程

        + 强调的是功能行为

        + 关注的是解决问题需要哪些步骤

    面向对象

        + 将功能封装进对象,强调具备了功能的对象

        + 关注的是解决问题需要哪些对象

    示例

    把衣服放进洗衣机

        + 面向过程

            * 打开洗衣机

            * 放进去衣服

            * 关闭洗衣机

        + 面向对象

            * 洗衣机-打开

            * 洗衣机-存储

            * 洗衣机-关闭

    现实生活中我们是如何应用面相对象思想的

        + 买电脑

        + 包工头

        + 女朋友

        + 想打电话\发短信

        + 去饭店吃饭

        + 汽车坏了

        + 面试

    ##3.面向对象的特点

    是一种符合人们思考习惯的思想

    可以将复杂的事情简单化

    将程序员从执行者转换成了指挥者

    完成需求时:

        + 先要去找具有所需的功能的对象来用。

        + 如果该对象不存在,那么创建一个具有所需功能的对象。

    这样简化开发并提高复用。

     

    类与对象

    ##1.类与对象的关系

    面向对象的核心就是对象,那怎么创建对象?

        + OC中创建对象比较复杂首先要理解一个概念叫做类.

        + 现实生活中是根据一份描述,一份模板创建对象,编程语言也一样,也必须先有一份描述,在这个描述中说清楚将来创建出来的对象有哪些属性和行为

    - OC中�述事物通过类的形式体现,类是多个同种类型事物的抽象,概念上的定义。

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/lhdx.png)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/lhxd2.png)

    - OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

    - OC利用类来创建对象,对象是类的具体存在因此面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

     

    类的设计

    ##1.如何设计一个类

    生活中描述事物无非就是描述事物的`名称`/`属性``行为`

        + 如:人有身高,体重等属性,有说话,打架等行为。

    事物名称(类名):(Person)

    属性:身高(height)、年龄(age)

    行为(功能):(run)、打架(fight)

    - OC中用类来描述事物也是如此

        + 属性:对应类中的成员变量。

        + 行为:对应类中的成员方法。

    定义类其实在定义类中的成员(成员变量和成员方法)

    ##2.如何分析一个类

    一般名词都是类(名词提炼法)

        + 飞机发射两颗炮弹摧毁了8辆装甲车

    飞机

    炮弹

    装甲车

        + 隔壁老王在公车上牵着一条叼着热狗的草泥马

    老王

    热狗

    草泥马

    拥有相同(或者类似)`属性`(状态特征)和`行为`(能干什么事)的对象都可以抽像成为一个类

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/840ea4d2c98b82537ae05392ec1efe63.jpg)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/0ec94824ab18972b5940000ae6cd7b899c510ad3.jpg)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/2478529_3.jpg)

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/20121212163355724.jpg)

     

    第一个OC

    ##1.如何声明一个类

    格式

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/smygl.png)

    注意:

        + 1.必须以@interface开头,@end结尾

        + 2.成员变量的声明,必须写在@interface@end之间的大括号中

        + 3.方法的声明必须在{}下面,不能写在{}

    ##2.如何实现一个类

    格式

    @implementation MyClass

    - (id)initWithString:(NSString *)aName

    {

        //写代码处

    }

    + (MyClass *)myClassWithString:(NSString *)aName

    {

        //写代码处

    }

    @end

    注意:

        + 1.必须以@implementation开头,@end结尾

        + 2.类名必须和声明的一致

    ##3.如何创建一个对象

    用类的方式告诉计算机,我们需要一个什么样的对象,之后我们要在程序中使用这个对象,就必须先创建一个对象

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/cjygl.png)

    注意[Car new];做了三件事

        + 1.在堆内存中开辟了一块新的存储空间

        + 2.初始化成员变量(写在类声明大括号中的属性就叫成员变量,也叫实例变量)

        + 3.返回指针地址

    消息机制

        + 使用对象调用方法就是OC中的消息机制

        + OC中调用方法的格式:[类名或者对象名 方法名];

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/xxjz.png)

    ##4.对象的注意点

    可以通过 对象->对象成员(注意声明属性为:@public) 的方式访问对象中的成员,

    每一个对象中都有一份属于自己的属性。

    对其中一个对象的成员进行了修改。和另一个对象没有关系

    对象方法的声明和实现

    ##本小节知识点

    1. 对象方法声明

    2. 对象方法实现

    ##1.对象方法声明

    格式

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/xxffsm.png)

    特征

        + 对象方法以-开头如 -(void)xx;

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

        + 对象方法中可以访问当前对象的成员变量

        + 调用格式 [对象名 对象方法名];

    示例

    //声明没有返回值的方法

    - (void)method;

    //声明有返回值的方法

    - (int)method;

    //声明有返回值有参数的方法

    - (int)method: (int)var;

    //声明有返回值有多个参数的方法

    - (int)method: (int)var1 andVar2: (int)var2;

    ##2.对象方法实现

        + 必须卸载以@implementation开头,@end之间

        + 在声明的后面加上{}即表示实现

    讲需要实现的代码写在{}

     

    类方法的声明和实现

    ##1.类方法声明

    格式

        + 将对象方法-号变为+

    特征

        + 类方法以+开头 如+(void)put;

        + 类方法只能由类来调用

        + 类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量。

    类方法的好处:

        + 节省内存空间

        + 不依赖于对象,执行效率更高;

        + 能用类方法解决的问题,尽量使用类方法;

    类方法的场合:

        + 当方法内部不需要使用到成员变量时,可以改为类方法

        + 类方法一般用于编写工具方法

    示例

    //声明没有返回值的方法

    + (void)method;

    //声明有返回值的方法

    + (int)method;

    //声明有返回值有参数的方法

    + (int)method: (int)var;

    //声明有返回值有多个参数的方法

    + (int)method: (int)var1 andVar2: (int)var2;

    ##2.类方法实现

        + 必须卸载以@implementation开头,@end之间

        + 在声明的后面加上{}即表示实现

        + 将需要实现的代码写在{}

    ##3.对象方法和类方法区别

    对象方法

        + 对象方法是属于对象的

        + 以减号-开头

        + 只能让对象调用,没有对象,这个方法根本不可能被执行

        + 对象方法能访问实例变量(成员变量)

        + 对象方法中可以调用当前对象的对象方法

        + 对象方法中可以调用其他对象的对象方法

        + 对象方法中部可以调用类方法

    类方法

        + 类方法是属于类的

        + 以加号+开头

        + 只能用类名调用,对象不能调用

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

        + 类方法中不能直接调用对象方法,要想调用对象方法,必须创建或传入对象。

    使用场合:

        + 当不需要访问成员变量的时候,尽量用类方法

    类方法和对象方法可以同名

     

    对象的存储细节

    ##1.对象的存储细节

    类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/dxdccxj.png)

    ##2.isa指针

    每一个对象都包含一个isa指针.这个指针指向当前对象所属的类。

    - [p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存 储于类中的方法,执行。

    - isa是对象中的隐藏指针,指向创建这个对象的类。

    通过isa指针我们可以在运行的时候知道当前对象是属于那个Class(类)的

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/isazz.png)

    ##3.使用一个类创建多个对象

    Car *car1 = [Car new];

    Car *car2 = [Car new]

    ```

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/cxdcj.png)

    ---

    函数与方法对比

    对象方法:

        + (1)对象方法的实现只能写在@implementation...@end,对象方法的声明只能写在 @interface...@end中间

        + (2)对象方法都以-号开头,类方法都以+号开头

        + (3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用

        + (4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end,但写在 @interface...@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。

        + (5)对象方法归类\对象所有

    函数:

        + (1)所有的函数都是平行的

        + (2)函数不存在隶属关系

        + (3)使用的时候可以直接调用

        + (4)不可以访问对象中的成员变量

    常见错误

    - 1)@interface @end@implementation @end不能嵌套包含

    - 2) OC是弱语法,可以只有@implementation,但实际开发中千万不要这样。

    - 4)漏写@end

    - 5)两个类的对象声明顺序(可以把顺序打乱)

    - 6)成员变量没有写在{}

    - 7)方法的声明写在了{}里面

    - 8)在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在

    - 9)方法无法像函数那样的调用

    - 10)成员变量和方法不能用static等关键字修饰,不要和c语言混淆

    - 11)类的实现可以写在mian函数后面,在使用之前只要有声明就可以

     

    展开全文
  • OC语言--OC语言基础、类

    千次阅读 2018-09-06 11:51:58
    一、OC语言基础 1&gt;OC文件的扩展名为.m、.c; 2&gt;OC语言完全兼容C语言,即OC语言中可以写C语言; 3&gt;OC语言也可以写C++语言,但是如果要写C++语言,则OC文件扩展名为.mm; 4&gt;OC语言是在...

    一、OC语言基础

    1>OC文件的扩展名为.m、.c;
    2>OC语言完全兼容C语言,即OC语言中可以写C语言;
    3>OC语言也可以写C++语言,但是如果要写C++语言,则OC文件扩展名为.mm;
    4>OC语言是在C语言的基础上增加了最小层的面向对象语言;
    

    二、OC语言与C语言
    这里写图片描述

    三、 <#import Foundation/Foundation.h>
    1.#import 与#include:

     1> 跟#include一样,拷贝文件的内容;
     2> 可以自动防止文件的内容被重复拷贝
    

    2.Foundation/Foundation.h

         1>Foundation表示是Foundation框架,Foundation.h成为Foundation框架中的主头文件,此文件中包含了框架中所有其他头文件;
         2> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件
    

    *四、 OC文件终端运行过程

    1> 编写OC源文件:.m、.c
    2> 编译:cc -c xxx.m xxx.c
    3> 链接:cc xxx.o xxx.o -framework Foundation
    (只有用到了Foundation框架才需要加上-framework Foundation)
    4> 运行:./a.out
    

    五、OC的BOOL类型

    1>BOOL类型其实是char类型,如下:Typedef  signed  char  BOOL
    2>BOOL类型中的YES和NO是宏定义,将1、0强制转换成BOOL类型:
    #define  Yes  (BOOL)1
    #define  NO  (BOOL)0
    


    OC语言面向对象语言,C语言是面向过程语言,面向对象语言中包含两个重要的概念:类和对象。OC利用类来创建对象,对象是类的具体存在。

    一、类的设计:
    类由类名、属性和行为构成。

    1> 类名:类名的第一个字母必须是大写、不能有下划线、多个英文单词,用驼峰标识,例如:Person;
    2>属性:属性的命名一般以_开头,例如:int _age;
    3>行为:一般小写,如果多个英文单词,采用驼峰标识;
    举例:
    * 类名:Car
    * 属性:wheel、speed
    * 行为:run
    *
    

    二、完整的类:

     类在内存中只有一份存储空间,在第一次调用类的时候,内存分配存储空间给类,类中只存放方法列表
    

    三、类的声明:

    1>类的声明中包含类的属性和行为;

    2>类的属性也称为类的成员变量(实例变量),写在大括号中;

    3>类的行为也称为类的方法,写在大括号外边,格式:- (返回值类型)方法名:(参数类型)参数名1:(参数类型)参数名2,例如- (void)test; -(int)pow2:(int)num;

    4>类的声明格式:

    @interface 类名 : NSObject //NSObject目的是:让Car这个类具备创建对象的能力

    { @public //@public可以让外部的指针间接访问对象内部的成员变量

    类的属性1;

    类的属性2;

    }

    • (void)类的行为名称;

    • (返回值类型)类的行为名称:(参数类型)参数;

    @end //@interface和@end成对出现

    示例:
    这里写图片描述
    类的声明注意事项:

    1> 只要是OC对象的方法,必须以减号 - 开头
    2> OC方法中任何数据类型都必须用小括号()扩住
    3> OC方法中的小括号():括住数据类型
    4> @interface和@end成对出现
    

    四、类的实现:用来实现@inteface中声明的方法
    类的实现格式:

    @implementation 类的名称
    
    - (void)类的方法名称
    
    {
    
        ...
    
    }
    
    
    
    @end
    

    例如:
    这里写图片描述

    五、Main函数中类的应用

    1>在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
    2>创建出一个新对象后会返回新对象本身(新对象的地址)
    3>利用类来创建对象
    

    六、类的设计完整代码示例:
    类的设计常见错误:

    1>@interface和@end中间不能嵌套@implementation和@end
    2>方法的声明中不能写实现;
    3>方法的声明在{}大括号外面;
    4>成员变量在声明时不能初始化,只有对象才有此属性,所以只有对象才能赋值;
    5>不能写- static (void)run;
    

    OC方法常见错误

    1>方法只有声明,没有实现(经典错误)
    2>方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
    3>编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
    

    七、函数与方法

     1.对象方法都是以减号 - 
     2.对象方法的声明必须写在@interface和@end之间
       对象方法的实现必须写在@implementation和@end之间
     3.对象方法只能由对象来调用
     4.对象方法归类\对象所有
    

    函数

     1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
    
     2.函数调用不依赖于对象
    
     3.函数内部不能直接通过成员变量名访问某个对象的成员变量
    
    展开全文
  • OC语言之Protocol基本使用

    千次阅读 2016-07-17 21:15:40
     +在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的 ...

    # Protocol基本概念

    ##1.protocol 基本概念

    - Protocol翻译过来, 叫做”协议”

        +在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的

        +protocol它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的

    - Protocol的作用

        +用来声明一些方法

        +也就说, 一个Protocol是由一系列的方法声明组成的

    ---

    ##2.protocol 语法格式

    - Protocol的定义

    ```

    @protocol 协议名称

    // 方法声明列表

    @end

    ```

    - 类遵守协议

        +一个类可以遵守1个或多个协议

        +任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明

    ```

    @interface 类名 : 父类 <协议名称1, 协议名称2,…>

    @end

    ```

    - 示例

    ```

    @protocol SportProtocol <NSObject>

    - (void)playFootball;

    - (void)playBasketball;

    @end

    #import "SportProtocol.h" // 导入协议

    @interface Studnet :NSObject<SportProtocol> // 遵守协议

    @end

     

    @implementation Student

    // 实现协议方法

    - (void)playBasketball

    {

       NSLog(@"%s", __func__);

    }

    // 实现协议方法

    - (void)playFootball

    {

       NSLog(@"%s", __func__);

    }

    @end

    ```

    ##3.protocol和继承区别

    - 继承之后默认就有实现, 而protocol只有声明没有实现

    - 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol

    - protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可

    ---

    # Protocol类型限制

    ##1.protocol类型限制

    - 设定情景:

        +某攻城狮A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。

        +满足条件的女生都可以向他发送消息

     

    - 从题目中我们得到要求

        +会做饭

        +会洗衣服

        +有份好工作

    ```

    @protocol WifeCondition<NSObject>

    - (void)cooking;

    - (void)washing;

    - (void)job;

    @end

    ```

    - 如何在代码中要求对象必须具备这些行为?

        +数据类型<协议名称> 变量名

    ```

    // 如果没有遵守协议则会报警告

    id<WifeCondition> wife = [[Personalloc] init];

    ```

    # 代理设计模式

    ##1.

    - 什么是设计模式

        +设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

    - 什么是代理设计模式

        +生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。

     

    - 代理设计模式的场合:

        +当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)

        +对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)

        +当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

    ---

    ##2.代理设计模式示例

    - 婴儿吃饭睡觉

    ```

    // 协议

    #import <Foundation/Foundation.h>

    @class Baby;

     

    @protocol BabyProtocol <NSObject>

    - (void)feedWithBaby:(Baby *)baby;

    - (void)hypnosisWithBaby:(Baby *)baby;

    @end

    ```

    #import "BabyProtocol.h"

    @interface Baby : NSObject

    // 食量

    @property (nonatomic, assign) int food;

    // 睡意

    @property (nonatomic, assign) intdrowsiness;

    // 饿

    - (void)hungry;

    // 睡意

    - (void)sleepy;

    @property (nonatomic, strong)id<BabyProtocol> nanny;

    @end

     

    @implementation Baby

     

    - (void)hungry

    {

       self.food -= 5;

       NSLog(@"婴儿饿了");

       // 通知保姆

       if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {

           [self.nanny feedWithBaby:self];

        }

    }

     

    - (void)sleepy

    {

       self.drowsiness += 5;

       NSLog(@"婴儿困了");

       // 通知保姆

       if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {

           [self.nanny hypnosisWithBaby:self];

        }

    }

    @end

    ```

    // 保姆

    @interface Nanny : NSObject<BabyProtocol>

    @end

     

    @implementation Nanny

    - (void)feedWithBaby:(Baby *)baby

    {

       baby.food += 10;

       NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);

    }

     

    - (void)hypnosisWithBaby:(Baby *)baby

    {

       baby.drowsiness += 10;

       NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness);

    }

    @end

    ```

    - 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人

    ---

    ##3.代理设计模式练习

    - 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找

    # 代理设计模式

    ##1.

    - 什么是设计模式

        +设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

     

    - 什么是代理设计模式

        +生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。

     

    - 代理设计模式的场合:

        +当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)

        +对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)

        +当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

    ---

    ##2.代理设计模式示例

    - 婴儿吃饭睡觉

    ```

    // 协议

    #import <Foundation/Foundation.h>

    @class Baby;

     

    @protocol BabyProtocol <NSObject>

    - (void)feedWithBaby:(Baby *)baby;

    - (void)hypnosisWithBaby:(Baby *)baby;

    @end

    ```

    #import "BabyProtocol.h"

    @interface Baby : NSObject

    // 食量

    @property (nonatomic, assign) int food;

    // 睡意

    @property (nonatomic, assign) intdrowsiness;

    // 饿

    - (void)hungry;

    // 睡意

    - (void)sleepy;

    @property (nonatomic, strong)id<BabyProtocol> nanny;

    @end

     

    @implementation Baby

     

    - (void)hungry

    {

       self.food -= 5;

       NSLog(@"婴儿饿了");

       // 通知保姆

       if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {

           [self.nanny feedWithBaby:self];

        }

    }

     

    - (void)sleepy

    {

       self.drowsiness += 5;

       NSLog(@"婴儿困了");

       // 通知保姆

       if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {

           [self.nanny hypnosisWithBaby:self];

        }

    }

    @end

    ```

    // 保姆

    @interface Nanny : NSObject<BabyProtocol>

    @end

     

    @implementation Nanny

     

    - (void)feedWithBaby:(Baby *)baby

    {

       baby.food += 10;

       NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);

    }

     

    - (void)hypnosisWithBaby:(Baby *)baby

    {

       baby.drowsiness += 10;

       NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness);

    }

    @end

    ```

    - 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人

    ---

    ##3.代理设计模式练习

    - 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找

     

    # 字符串读写

    ##1.直接读写文件中的字符

    - 从文件中读取

    ```

    // 用来保存错误信息

    NSError *error = nil;

    // 读取文件内容

    NSString *str = [NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error];

    // 如果有错误信息

    if (error) {

       NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);

    } else { // 如果没有错误信息

       NSLog(@"读取成功, 文件内容是:\n%@", str);

    }

    ```

    - 写入文件中

    ```

    NSString *str = @"江哥";

    BOOL flag = [strwriteToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];

    if (flag == 1)

    {

       NSLog(@"写入成功");

    }

    ```

    - 重复写入同一文件会覆盖掉上一次的内容

     

    ```

    NSString *str1 = @"江哥";

    BOOL flag = [str1writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];

     

    NSString *str2 = @"南哥";

    [str2writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];

     

    NSString *str = [NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error];

    NSLog(@"str = %@", str);

     

    输出结果:南哥

    ---

    ##2.NSURL简介

    - 什么是URL

        +URL的全称是Uniform Resource Locator(统一资源定位符)

        +URL是互联网上标准资源的地址

        + 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置

        +根据一个URL就能找到唯一的一个资源

     

    - URL的格式

        +基本URL包含协议、主机域名(服务器名称\IP地址)、路径

        +举例: http://www.520it.com/ios/images/content_25.jpg

        +可以简单认为: URL == 协议头://主机域名/路径

     

    - 常见的URL协议头(URL类型)

        +http\https :超文本传输协议资源, 网络资源

        +ftp :文件传输协议

        +file :本地电脑的文件

     

    - URL的创建

        +传入完整的字符串创建

    ```

    NSURL *url = [NSURLURLWithString:@"file:///Users/LNJ/Desktop/str.txt"];

    ```

        +通过文件路径创建(默认就是file协议的)

    ```

    NSURL *url = [NSURLfileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];

    ```

    ##3.使用NSURL读写字符串

    - 从URL中读取

    ```

    // 用来保存错误信息

    NSError *error = nil;

     

    // 创建URL路径

    //   NSString *path =@"file://192.168.199.119/Users/LNJ/Desktop/lnj.txt";

     

    //  本机可以省略主机域名

    //   NSString *path = @"file:///Users/LNJ/Desktop/lnj.txt";

       NSURL *url = [NSURL URLWithString:path];

     

    //  利用fileURLWithPath方法创建出来的URL默认协议头为file://

    NSURL *url = [NSURLfileURLWithPath:@"/Users/LNJ/Desktop/lnj.txt"];

     

    // 读取文件内容

    NSString *str = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

     

    // 如果有错误信息

    if (error) {

       NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);

    } else { // 如果没有错误信息

       NSLog(@"读取成功, 文件内容是:\n%@", str);

    }

    ```

    - 写入URL中

    ```

    NSString *str = @"江哥";

    [str writeToURL:[NSURLURLWithString:@"/Users/LNJ/Desktop/lnj.txt"] atomically:YES encoding:NSUTF8StringEncodingerror:nil];

    ```

    # 字符串比较

    ##1.NSString大小写处理

    - 全部字符转为大写字母

        +\- (NSString *)uppercaseString;

    - 全部字符转为小写字母

        +\- (NSString *)lowercaseString

    - 首字母变大写,其他字母都变小写

        +\- (NSString *)capitalizedString

    ---

    ##2.NSString比较

    - \- (BOOL)isEqualToString:(NSString*)aString;

        +两个字符串的内容相同就返回YES, 否则返回NO

    ```

       NSString *str1 = @"lnj";

       NSString *str2 = [NSString stringWithFormat:@"lnj"];

       if ([str1 isEqualToString:str2]) {

           NSLog(@"字符串内容一样");

        }

     

       if (str1 == str2) {

           NSLog(@"字符串地址一样");

        }

    ```

    - \- (NSComparisonResult)compare:(NSString*)string;

        +这个方法可以用来比较两个字符串内容的大小

        +比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果

        +NSComparisonResult是一个枚举,有3个值:

           * 如果左侧   > 右侧,返回NSOrderedDescending,

           * 如果左侧   < 右侧,返回NSOrderedAscending,

           * 如果左侧  == 右侧返回NSOrderedSame

    ```

       NSString *str1 = @"abc";

       NSString *str2 = @"abd";

       switch ([str1 compare:str2]) {

           case NSOrderedAscending:

               NSLog(@"后面一个字符串大于前面一个");

               break;

           case NSOrderedDescending:

               NSLog(@"后面一个字符串小于前面一个");

               break;

           case NSOrderedSame:

               NSLog(@"两个字符串一样");

               break;

        }

        输出结果: 后面一个字符串大于前面一个

    ```

    - \- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;

        +忽略大小写进行比较,返回值与compare:一致

    ```

       NSString *str1 = @"abc";

       NSString *str2 = @"ABC";

       switch ([str1 caseInsensitiveCompare:str2]) {

           case NSOrderedAscending:

               NSLog(@"后面一个字符串大于前面一个");

               break;

           case NSOrderedDescending:

               NSLog(@"后面一个字符串小于前面一个");

               break;

           case NSOrderedSame:

               NSLog(@"两个字符串一样");

               break;

        }

        输出结果:两个字符串一样

    ```

    # 字符串搜索

    ##1.字符串搜索

    - \- (BOOL)hasPrefix:(NSString *)aString;

        +是否以aString开头

    - \- (BOOL)hasSuffix:(NSString *)aString;

        +是否以aString结尾

    - \- (NSRange)rangeOfString:(NSString*)aString;

        +用来检查字符串内容中是否包含了aString

        +如果包含, 就返回aString的范围

        +如果不包含, NSRange的location为NSNotFound, length为0

    ---

    ##2.NSRange基本概念

    - NSRange是Foundation框架中比较常用的结构体, 它的定义如下:

    ```

    typedef struct _NSRange {

       NSUInteger location;

       NSUInteger length;

    } NSRange;

    // NSUInteger的定义

    typedef unsigned int NSUInteger;

    ```

    - NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围

     

    - NSRange有2个成员

        +NSUInteger location : 表示该范围的起始位置

        +NSUInteger length : 表示该范围内的长度

     

    - 比如@“I love LNJ”中的@“LNJ”可以用location为7,length为3的范围来表示

    ---

    ##3.NSRange的创建

    - 有3种方式创建一个NSRange变量

    - 方式1

    ```

    NSRange range;

    range.location = 7;

    range.length = 3;

    ```

    - 方式2

    ```

    NSRange range = {7, 3};

    或者

    NSRange range = {.location = 7,.length =3};

    ```

    - 方式3 : 使用NSMakeRange函数

    ```

    NSRange range = NSMakeRange(7, 3);

    ```

    # 字符串截取

    ##1.字符串的截取

    - \- (NSString*)substringFromIndex:(NSUInteger)from;

        +从指定位置from开始(包括指定位置的字符)到尾部

    ```

       NSString *str = @"<head>小码哥</head>";

       str = [str substringFromIndex:7];

       NSLog(@"str = %@", str);

     

    输出结果: 小码哥</head>

    ```

    - \- (NSString*)substringToIndex:(NSUInteger)to;

        +从字符串的开头一直截取到指定的位置to,但不包括该位置的字符

    ```

       NSString *str = @"<head>小码哥</head>";

       str = [str substringToIndex:10];

       NSLog(@"str = %@", str);

    输出结果: <head>小码哥

    ```

    - \- (NSString*)substringWithRange:(NSRange)range;

        +按照所给出的NSRange从字符串中截取子串

    ```

       NSString *str = @"<head>小码哥</head>";

       NSRange range;

       /*

       range.location = 6;

       range.length = 3;

       */

       range.location = [str rangeOfString:@">"].location + 1;

       range.length = [str rangeOfString:@"</"].location -range.location;

       NSString *res = [str substringWithRange:range];

       NSLog(@"res = %@", res);

    输出结果: 小码哥

    ```

    # 字符串替换

    ##1.字符串的替换函数

    - \- (NSString*)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString*)replacement;

        +用replacement替换target

    ```

       NSString *str = @"http:**520it.com*img*ljn.gif";

       NSString *newStr = [strstringByReplacingOccurrencesOfString:@"*" withString:@"/"];

       NSLog(@"newStr = %@", newStr);

    输出结果: http://www.520it.com/img/ljn.gif

    ```

    - \- (NSString*)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;

        +去除首尾

    ```

       NSString *str =  @"   http://520it.com/img/ljn.gif   ";

       NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];

       NSLog(@"str =|%@|", str);

       NSLog(@"newStr =|%@|", newStr);

     

    输出结果:

    str =|  http://520it.com/img/ljn.gif   |

    newStr =|http://520it.com/img/ljn.gif|

    ```

       NSString *str = @"***http://520it.com/img/ljn.gif***";

       NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@"*"]];

     

       NSLog(@"str =|%@|", str);

       NSLog(@"newStr =|%@|", newStr);

     

    输出结果:

    str =|***http://520it.com/img/ljn.gif***|

    newStr =|http://520it.com/img/ljn.gif|

    ```

    # 字符串与路径

    ##1.NSString与路径

    - \- (BOOL)isAbsolutePath;

        +是否为绝对路径

    ```

        // 其实就是判断是否以/开头

    //   NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";

       NSString *str = @"Users/NJ-Lee/Desktop/lnj.txt";

       if ([str isAbsolutePath]) {

           NSLog(@"是绝对路径");

       }else

        {

           NSLog(@"不是绝对路径");

        }

    ```

    - \- (NSString *)lastPathComponent;

        +获得最后一个目录

    ```

       // 截取最后一个/后面的内容

       NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";

       NSString *component = [str lastPathComponent];

       NSLog(@"component = %@", component);

    ```

    - \- (NSString*)stringByDeletingLastPathComponent;

        +删除最后一个目录

    ```

       // 其实就是上次最后一个/和之后的内容

       NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";

       NSString *newStr = [str stringByDeletingLastPathComponent];

       NSLog(@"newStr = %@", newStr);

    ```

    - \- (NSString*)stringByAppendingPathComponent:(NSString *)str;

        +在路径的后面拼接一个目录

    (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)

    ```

    // 其实就是在最后面加上/和要拼接得内容

       // 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个

    //   NSString *str = @"/Users/NJ-Lee/Desktop";

       NSString *str = @"/Users/NJ-Lee/Desktop/";

       NSString *newStr = [strstringByAppendingPathComponent:@"lnj"];

       NSLog(@"newStr = %@", newStr);

    ```

    ##2.NSString与文件拓展名

    - \- (NSString *)pathExtension;

        +获得拓展名

    ```

       // 其实就是从最后面开始截取.之后的内容

    //   NSString *str = @"lnj.txt";

       NSString *str = @"abc.lnj.txt";

       NSString *extension = [str pathExtension];

       NSLog(@"extension = %@", extension);

    ```

    - \- (NSString*)stringByDeletingPathExtension;

        +删除尾部的拓展名

    ```

       // 其实就是上次从最后面开始.之后的内容

    //   NSString *str = @"lnj.txt";

       NSString *str = @"abc.lnj.txt";

       NSString *newStr = [str stringByDeletingPathExtension];

       NSLog(@"newStr = %@", newStr);

    ```

    - \- (NSString*)stringByAppendingPathExtension:(NSString *)str;

        +在尾部添加一个拓展名

    ```

    // 其实就是在最后面拼接上.和指定的内容

       NSString *str = @"lnj";

       NSString *newStr = [strstringByAppendingPathExtension:@"gif"];

       NSLog(@"newStr = %@", newStr);

    ```

    # 字符串与基本数据类型转换

    ##1.

    - \- (NSUInteger)length;

        +返回字符串的长度(有多少个文字)

     

    - \-(unichar)characterAtIndex:(NSUInteger)index;

        +返回index位置对应的字符

    ---

    ##2.字符串和其他数据类型转换

    - 转为基本数据类型

        +\- (double)doubleValue;

        +\- (float)floatValue;

        +\- (int)intValue;

    ```

       NSString *str1 = @"110";

       NSString *str2 = @"10";

       int res = str1.intValue + str2.intValue;

       NSLog(@"res = %i", res);

    ```

       NSString *str1 = @"110";

       NSString *str2 = @"10.1";

       double res = str1.doubleValue + str2.doubleValue;

       NSLog(@"res = %f", res);

    ```

    - 转为C语言中的字符串

        +\- (char *)UTF8String;

    ```

       NSString *str = @"abc";

       const char *cStr = [str UTF8String];

        NSLog(@"cStr= %s", cStr);

    ```

       char *cStr = "abc";

       NSString *str = [NSString stringWithUTF8String:cStr];

       NSLog(@"str = %@", str);

    ```

    # NSMutableString练习

    ##1.NSMutableString练习

    - 从要求讲3个520it拼接在一起

     

    - 会生成很多新的字符串

    ```

       NSString *res = @"";

       NSString *subStr = @"520";

       // 1.拼接字符串

    //   res = [res stringByAppendingString:subStr];

    //   res = [res stringByAppendingString:@" "];

    //

    //   res = [res stringByAppendingString:subStr];

    //   res = [res stringByAppendingString:@" "];

    //

    //   res = [res stringByAppendingString:subStr];

    //   res = [res stringByAppendingString:@" "];

     

       for (int i = 0; i < 3; ++i) {

           res = [res stringByAppendingString:subStr];

           res = [res stringByAppendingString:@" "];

        }

       // 2.删除末尾的空格

    //   res = [res stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];

       res = [res substringToIndex:res.length - 1];

       NSLog(@"res = |%@|", res);

    ```

    - 不会生成新的字符串

    ```

       NSString *subStr = @"520it";

       NSMutableString *res = [NSMutableString string];

       // 1.拼接字符串

       for (int i = 0; i < 3; ++i) {

           [res appendString:subStr];

           [res appendString:@" "];

        }

       // 2.删除空格

    //   [res replaceCharactersInRange:NSMakeRange(res.length - 1, 1)withString:@""];

       [res deleteCharactersInRange:NSMakeRange(res.length - 1, 1)];

       NSLog(@"res = |%@|", res);

    ```

    # NSMutableString常用方法

    ##1.NSMutableString常用方法

    - \- (void)appendString:(NSString*)aString;

        +拼接aString到最后面

    ```

    - \- (void)appendFormat:(NSString *)format,...;

        +拼接一段格式化字符串到最后面

    ```

       NSMutableString *strM = [NSMutableString string];

       NSLog(@"strM = %@", strM);

       [strM appendString:@"lnj"];

       NSLog(@"strM = %@", strM);

    ```

    - \-(void)deleteCharactersInRange:(NSRange)range;

        +删除range范围内的字符串

    ```

       NSMutableString *strM = [NSMutableStringstringWithString:@"http://www.520it.com"];

        // 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容

        NSRange range = [strM rangeOfString:@"http://"];

        [strM deleteCharactersInRange:range];

        NSLog(@"strM = %@", strM);

    ```

    - \- (void)insertString:(NSString *)aStringatIndex:(NSUInteger)loc;

        +在loc这个位置中插入aString

    ```

       NSMutableString *strM = [NSMutableStringstringWithString:@"www.520it.com"];

       [strM insertString:@"http://" atIndex:0];

        NSLog(@"strM= %@", strM);

    ```

    - \-(void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;

        +使用aString替换range范围内的字符串

    ```

       NSMutableString *strM = [NSMutableStringstringWithString:@"http://www.520it.com/lnj.png"];

       NSRange range = [strM rangeOfString:@"lnj"];

       [strM replaceOccurrencesOfString:@"lnj"withString:@"jjj" options:0 range:range];

       NSLog(@"strM = %@", strM);

    ```

    ##2.字符串使用注意事项

    - @”lnj”这种方式创建的字符串始终是NSString,不是NSMutalbeString.所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。

    ```

    NSMutalbeString *s1 = @”lnj”;

    // 会报错

    [strM insertString:@"my name is "atIndex:0];

    ```

    # NSArray 遍历

    ##1.NSArray的下标遍历

    ```

       NSArray *arr = @[p1, p2, p3, p4, p5];

       for (int i = 0; i < arr.count; ++i) {

           Person *p = arr[i];

           [p say];

        }

    ```

    ##2.NSArray的快速遍历

    ```

       NSArray *arr = @[p1, p2, p3, p4, p5];

      for (Person *p in arr) {

           [p say];

        }

    ```

    ##3.NSArray 使用block进行遍历

    ```

       [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

           NSLog(@"obj = %@, idx = %lu", obj, idx);

           Person *p = obj;

           [p say];

       }];

    ```

    ##4.NSArray给所有元素发消息

    - 让集合里面的所有元素都执行aSelector这个方法

        +\- (void)makeObjectsPerformSelector:(SEL)aSelector;

        +\- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;

    ```

       // 让数组中所有对象执行这个方法

       // 注意: 如果数组中的对象没有这个方法会报错

    //   [arr makeObjectsPerformSelector:@selector(say)];

       [arr makeObjectsPerformSelector:@selector(eat:)withObject:@"bread"];

    ```

    # NSArray排序

    ##1.NSArray排序

    - Foundation自带类排序

    ```

    NSArray *arr = @[@(1), @(9), @(5), @(2)];

    NSArray *newArr = [arrsortedArrayUsingSelector:@selector(compare:)];

    ```

    - 自定义类排序

    ```

       NSArray *arr = @[p1, p2, p3, p4, p5];

       //    默认按照升序排序

       NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrentusingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {

           return obj1.age > obj2.age;

       }];

       NSLog(@"%@", newArr);

    ---

    # NSArray文件读写

    ##1.NSArray数据写入到文件中

    ```

       NSArray *arr = @[@"lnj", @"lmj", @"jjj",@"xcq"];

       BOOL flag = [arrwriteToFile:@"/Users/LNJ/Desktop/persons.plist" atomically:YES];

       NSLog(@"%i", flag);

    ```

    ##2.从文件中读取数据到NSArray中

    ```

       NSArray *newArr = [NSArrayarrayWithContentsOfFile:@"/Users/LNJ/Desktop/persons.xml"];

       NSLog(@"%@", newArr);

    ```

    # NSArray 与字符串

    ##1.把数组元素链接成字符串

    - \- (NSString*)componentsJoinedByString:(NSString *)separator;

        +这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串

    ```

       NSArray *arr = @[@"lnj", @"lmj", @"jjj",@"xcq"];

       NSString *res = [arr componentsJoinedByString:@"*"];

       NSLog(@"res = %@", res);

    输出结果:

    lnj*lmj*jjj*xcq

    ```

    ##2.字符串分割方法

    - \- (NSArray*)componentsSeparatedByString:(NSString *)separator;

        +这是NSString的方法,将字符串用separator作为分隔符切割成数组元素

    ```

       NSString *str = @"lnj-lmj-jjj-xcq";

       NSArray *arr = [str componentsSeparatedByString:@"-"];

       NSLog(@"%@", arr);

    输出结果:

    (

       lnj,

       lmj,

       jjj,

       xcq

    )

     

    # Foundation框架介绍

    ##1.Foundation框架介绍

    - 什么是框架?

        +众多功能\API的集合

        +框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架

     

    - Foundation框架的作用

        +Foundation框架是Mac\iOS中其他框架的基础

        +Foundation框架包含了很多开发中常用的数据类型:

           * 结构体

           * 枚举

           * 类

     

    - 如何使用Foundation框架

        +Foundation框架中大约有125个可用的头文件,作为一个简单的形式,可以简单地使用以下语句导入#import<Foundation/Foundation.h>因为Foundation.h文件实际上导入其他所有Foundation框架中的头文件

     

    - Foundation框架中的类

        +Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)

        +Foundation框架提供了非常多好用的类, 比如

    ```

    NSString : 字符串

    NSArray : 数组

    NSDictionary : 字典

    NSDate : 日期

    NSData : 数据

    NSNumber : 数字

    ```

    - Foundation框架中的类都是以NS为前缀(Next Step的缩写)

        +乔布斯于1976年创立苹果公司

        +乔布斯于1985年离开苹果公司, 创立NeXT公司, 开发了Next Step操作系统

        +在开发Next Step操作系统过程中产生了Foundation框架

        +1997年, 苹果公司收购NeXT公司,   乔布斯重返苹果公司(Mac系统就是基于NextStep系统)

        +2007年, 苹果公司发布了iOS系统(iOS系统基于Mac系统)

    ---

    ##2.Foundation框架常见错误

    - 有时候会在不经意之间修改了系统自带的头文件,比如NSString.h, 这时会出现以下错误:

    ![](http://7xj0kx.com1.z0.glb.clouddn.com/foundationerror.png)

    - 解决方案很简单, 只需要删除Xcode的缓存即可

        +缓存路径是/Users/用户名/Library/Developer/Xcode/DerivedData(默认情况下, 这是一个隐藏文件夹)

     

    - 要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下

        +显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true

        +隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false

        +(输入指令后, 一定要重新启动Finder)

     

    # NSArray基本概念

    ##1.NSArray的基本概念

    - 什么是NSArray?

        +NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组

        +C语言中数组的弊端

           * int array[4] = {10, 89, 27, 76};

           * 只能存放一种类型的数据.(类型必须一致)

           * 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)

     

    - NSArray的使用注意

        +只能存放任意OC对象, 并且是有顺序的

        +不能存储非OC对象, 比如int\float\double\char\enum\struct等

        +它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素

    ---

    ##2.NSArray的创建方式

    - \+ (instancetype)array;

    - \+(instancetype)arrayWithObject:(id)anObject;

    - \+ (instancetype)arrayWithObjects:(id)firstObj,...;

    - \+ (instancetype)arrayWithArray:(NSArray*)array;

     

    - \+ (id)arrayWithContentsOfFile:(NSString*)path;

    - \+ (id)arrayWithContentsOfURL:(NSURL*)url;

    ---

    ##3.NSArray 的使用注意事项

    - NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。

    - NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。

    ```

       NSArray *arr = [NSArray arrayWithObjects:@"lnj", nil,@"lmj",@"jjj", nil];

       NSLog(@"%@", arr);

    输出结果:

    (

       lnj

    )

    ```

    ##4.NSArray的常用方法

    - \- (NSUInteger)count;

        +获取集合元素个数

     

    - \- (id)objectAtIndex:(NSUInteger)index;

        +获得index位置的元素

     

    - \- (BOOL)containsObject:(id)anObject;

        +是否包含某一个元素

     

    - \- (id)lastObject;

        +返回最后一个元素

     

    - \- (id)firstObject;

        +返回最后一个元素

     

    - \-(NSUInteger)indexOfObject:(id)anObject;

        +查找anObject元素在数组中的位置(如果找不到,返回-1)

     

    - \- (NSUInteger)indexOfObject:(id)anObjectinRange:(NSRange)range;

        +在range范围内查找anObject元素在数组中的位置

    ---

    ##5.NSArray的简写形式

    - 自从2012年开始, Xcode的编译器多了很多自动生成代码的功能, 使得OC代码更加精简

     

    - 数组的创建

        +之前

    ```

    [NSArray arrayWithObjects:@"Jack",@"Rose", @"Jim", nil];

    ```

        +现在

    ```

    @[@"Jack", @"Rose",@"Jim"];

    ```

    - 数组元素的访问

        +之前

    ```

    [array objectAtIndex:0];

    ```

        +现在

    ```

    array[0];

    ```

    # NSMutableArray基本概念

    ##1.NSMutableArray介绍

    - 什么是NSMutableArray

        +NSMutableArray是NSArray的子类

        +NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素

        +NSMutableArray是可变的,随时可以往里面添加\更改\删除元素

    ---

    ##2.NSMutableArray基本用法

    - 创建空数组

    ```

    NSMutableArray *arr = [NSMutableArrayarray];

    ```

    - 创建数组,并且指定长度为5,此时也是空数组

    ```

    NSMutableArray *arr2 = [[NSMutableArrayalloc] initWithCapacity:5];

    ```

    - 创建一个数组,包含两个元素

    ```

    NSMutableArray *arr3 = [NSMutableArrayarrayWithObjects:@"1",@"2", nil];

    ```

    - 调用对象方法创建数组

    ```

    NSMutableArray *arr4 = [[NSMutableArrayalloc] initWithObjects:@"1",@"2", nil];

    ```

    - \- (void)addObject:(id)object;

        +添加一个元素

    - \- (void)addObjectsFromArray:(NSArray*)array;

        +添加otherArray的全部元素到当前数组中

    - \- (void)insertObject:(id)anObjectatIndex:(NSUInteger)index;

        +在index位置插入一个元素

    - \- (void)removeLastObject;

        +删除最后一个元素

     

    - \- (void)removeAllObjects;

        +删除所有的元素

     

    - \-(void)removeObjectAtIndex:(NSUInteger)index;

        +删除index位置的元素

     

    - \- (void)removeObject:(id)object;

        +删除特定的元素

     

    - \-(void)removeObjectsInRange:(NSRange)range;

        +删除range范围内的所有元素

     

    - \- (void)replaceObjectAtIndex:(NSUInteger)indexwithObject:(id)anObject;

        +用anObject替换index位置对应的元素

     

    - \-(void)exchangeObjectAtIndex:(NSUInteger)idx1withObjectAtIndex:(NSUInteger)idx2;

        +交换idx1和idx2位置的元素

    ---

    ##3.NSMutableArray 错误用法

    - 不可以使用@[]创建可变数组

    ```

    NSMutableArray *array = @[@"lnj",@"lmj", @"jjj"];

    // 报错, 本质还是不可变数组

    [array addObject:@“Peter”];

    ```

    # NSMutableString基本概念

    ##1.NSMutableString 基本概念

    - NSMutableString 类 继承NSString类,那么NSString

    展开全文
  • OC语言三大特性

    千次阅读 2017-04-06 15:08:04
    三大特性为:封装,继承,多态 一、封装(成员变量的封装)  1. set方法(提供一个方法,让外界设置成员变量的值,可以在方法里面对参数进行过滤)  命名规范:1>方法名必须以set开头 2>set后面跟上成员变量的名称...


    三大特性为:封装,继承,多态


    一、封装(成员变量的封装)

       1. set方法(提供一个方法,让外界设置成员变量的值,可以在方法里面对参数进行过滤)

        (1)命名规范:1> 方法名必须以set开头

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

                                3> 返回值一定是void类型

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

                                5> 形参名称不能跟成员变量名称一致

        (2)set方法的声明和实现

                声明:-(void)setAge:(int)newAge

                实现:-(void)setAge:(int)newAge

                   {

                       if (newAge<=0)   //对参数进行过滤

                     {

                       newAge=1;

                     }

                        age=newAge;

                  }

      2. get方法(返回对象内部的成员变量)

       (1)命名规范:1> 肯定有返回值,返回值类型肯定和成员变量一致

                               2> 方法名与成员变量名一致

                               3> 不需要接收任何参数

       (2)get方法的声明和实现

               声明:-(int)age

               实现:-(int)age

               {

                             return age;

               }

                只允许访问,不允许修改 ,只提供get方法(只读)

        3. 封装的好处

       (1)过滤不合理的值

       (2)屏蔽内部的赋值过程

       (3)让外界不必关注内部的细节

       4. 成员变量的书写规范(一般以下划线_开头,为了跟get方法的方法名,局部变量区别开)

       5. 类方法

       (1)类方法以+开头,只能由类调用

      (2)允许对象方法和类方法同名

      (3)成员变量不能在类方法中访问

      (4)在对象方法中可以调用类方法

        类方法的好处和使用场合

      (1)不依赖于对象

      (2)开发中能使用类方法尽量使用类方法

      (3)当方法内部不需要使用成员变量时,就可以改为类方法

      6. self 访问成员变量(self是一个指针)

      (1)概念:self指向当前对象(方法调用者)

      (2)可以用“self->成员变量名”访问当前对象内部的成员变量

      (3)[self 方法名]可以调用其他对象方法或者类方法

      (4)谁调用了当前方法,self就代表谁

      (5)self 如果出现在对象方法中,self就代表对象

      (6)self 如果出现在类方法中,self就代表类

    二、继承

        1. 继承的好处:

        (1)抽取了重复代码

        (2)建立了类与类之间的联系

        2. 子类可以拥有父类中的所有成员变量和方法

            类B : 类A     //类B继承了类A,相当于类B拥有了类A中所有的成员变量和方法

            类B称为类A的子类,类A称为类B的父类

       3. 基本上所有类的根类都是NSObject

      4. 使用注意:

       (1)不允许子类和父类拥有相同的成员变量

       (2)父类放在子类之前声明

       (3)子类和父类允许有相同的方法,

       (4)调用某个对象的方法时,优先去当前类中找,如果找不到,再去父类中找

       (5)子类重新实现父类的某个方法,会覆盖父类以前的方法

       5. 每个类中都有一个superclass指针指向父类

       6. 继承的缺点:耦合性太强(类与类之间的关系过于紧密)

       7. 继承和组合

           继承:XX 是XXX

           组合:XX拥有XXX (格式 : score  *_score)

       8. super的用法

       (1) [super walk]      直接调用父类中的walk方法

       (2)super不仅可以调用对象方法,还可以调用类方法

       (3)super处在对象方法中,就会调用父类的对象方法,super处在类方法中,就会调用父类的类方法

    三、多态(多种形态

        1. 要想使用多态必须使用继承(继承是多态的前提)

        2. 多态:父类指针指向子类对象    Animal * a=[Dog  new];调用方法时会检测对象的真实形象

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

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


         



     


    展开全文
  • OC语言大总结(上)

    千次阅读 2015-10-11 11:07:39
    根据OC学习的知识点,总结了一下,希望能帮到大家! 作者:韩俊强  未经允许,请勿转载! 关注博主:http://weibo.com/hanjunqiang 第一节 类于对象 类与对象...
  • OC语言(一)

    2015-02-05 08:48:46
    一.概述 1.基本上所有关键词@开头 2.字符串以@开头,如@“Hello” 3.基本数据类型 char int float double BOOL(YES\NO) 4.空为nil 5.注释同C语音 6.屏幕输出 NSLog(@“String”);...8.OC语言.m到.o再到.out
  • OC语言——基本语法和思想

    千次阅读 2015-07-20 21:29:51
    今天学习了OC语言基础语法
  • OC 语言

    千次阅读 2016-06-14 18:46:11
    OC 语言 共94题   1、#import 跟#include、@class有什么区别?#import 1)#import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次,防止交叉编译 2)@class仅仅是声明一个类名...
  • iOS开发中 c与OC的使用比例是多少?

    万次阅读 2015-05-19 09:15:00
    OC是C的”超集(superset)”。两者有紧密的联系。...因此,必须同时掌握好C与OC这两门语言的核心概念,才能写出高效的OC代码来。 其中尤为重要的是理解c语言的内存模型(memory model),这有助于理解
  • 在项目里交叉使用Swift和OC

    万次阅读 2014-06-27 16:45:14
    Swift与OC的兼容性使得你可以在项目里使用Swift+OC的方式编写应用程序,称为混合+匹配(mix and match),用这种方式可以一边使用享受新语言的快速特性,一边无缝的接合你已有的OC代码(原文听起来好NB的样子,其实也就...
  • swift-01-简述swift与OC区别

    千次阅读 2015-08-11 10:58:10
    swift语言 Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言 Swift是供iOS和OS...
  • OC与C++还有Java等面向对象语言类似,但是还是有很多区别,但是如果你用过C++或者Java,再学习OC,就很容易理解OC所用的许多范式与模板了。 对于OC来说,OC使用了“消息结构”(messaging structure)而不是“函数调用...
  • OC坑集: block作为函数参数

    万次阅读 2020-05-05 12:38:19
    对于 OC 的争论一直不休, 对于一门语言, 我觉得只要能解决你的问题就够了. 评论一门编程语言之前, 你需要真正的去用它, OC 孰好孰坏, 需要你自己去尝试. OC 坑集, 主要记载使用 OC 开发项目遇到的问题, 尽量简洁明了...
  • OC 使用 “消息结构”

    千次阅读 2015-05-31 14:47:59
     OC语言由Smalltalk演化而来,Smalltalk是消息型语言的鼻祖。 消息与函数调用的区别看起来是这样: // 消息 Object *o=[object new]; [o performWith:pl and:p2];   // 函数调用 (c++) Object *
  • OC代码中使用Swift文件的实践

    千次阅读 2018-05-31 11:32:11
    最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。 今天研究了一下如何在OC项目中使用swift文件,即OC和swift的混编问题,发现在OC中要使用...
  • 为什么说OC是动态语言

    千次阅读 2017-06-19 16:47:47
    1.动态类型: 即运行时再决定对象的类型。简单说就是id类型,任何对象都可以被id指针所指,只有在运行时 才能决定是什么类型。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编 译的时候就能...
  • OC项目中使用Swift

    万次阅读 2016-02-27 09:23:30
    OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue 独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用...
  • OC和Swift混编Pod引入第三方库的问题 问题描述:Swift应用OC 的开源框架,需要创建一个桥接头文件,问题就出在这个看似简单,却隐藏着一个巨大的问题:一切都按部就班的在桥接头文件中引入了OC 头文件,但是...
  • C4D 英文界面设置为中文界面

    千次阅读 2018-03-29 15:41:14
    在某网站学习C4D,看到老师的界面是中文版的,明明安装的时候选择语言是中文,结果运行后界面还是英文,然后就找了找,不用插件直接设置语言就好。1、打开C4D2、Edit----&gt; Preferences...3、Interface----&...
  • OC与C++的互相调用

    千次阅读 2017-02-10 12:25:34
    新建一个iOS工程 ...printf是c语言的语法,所以我们可以看出,oc是支持c语言的 我们给viewcontroller里面引用一个头文件#include 会报错,这个文件是c++的一个引用 当我们把viewcontroller的后缀改成.mm后,
1 2 3 4 5 ... 20
收藏数 30,409
精华内容 12,163
关键字:

oc语言