Objective-C基础笔记一

目录

这里开始了我OC旅程


花了8天的时间粗略的学习了新知识Objective-C(简称OC),虽然只是学习了其中的基础部分,但经过这一周的学习也算是入门了。对面向对象的封装、继承、多态以及其中所包含的方法等有了初步的认识。
现正好是五一小假期做笔记整理,下面直奔主题总结笔记:


目录

Objective-C简介(了解)


本小节知识点

【了解】Objective-C简介
【了解】Objective-C发展现状
【了解】Objective-C语言学习路线及重难点
【了解】学习目标


1. Objective-C简介

  • Objective-C是一种面向对象的计算机语言
  • OC不是一门全新的语言
  • C语言的基础上增加了一层最小的面向对象语法
  • OC完全兼容C语言
  • 可以在OC代码中混入C语言代码,甚至是C++代码
  • 可以使用OC开发Mac OS X平台和iOS平台的应用程序

2. Objective-C发展现状

  • 1986年,BradCox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言。
  • 1985年,被赶出苹果公司的Steve Jobs成立了NeXT公司,致力于开发强大且经济的工作 站。NeXT选择Unix作为其操作系统
  • 1988年Steve Jobs获得了Objective-C的使用版权,使用Objective-C来编写NeXTSTEP操作系统,Objective-C使得设计NeXTSTEP操作系统更加容易
  • 1994,NeXT与Sun共同制定OpenStep API标准,其中两个重要的部分是Foundation跟 Application Kit,此时开始使用命名前缀NS。
  • 在1995年,NeXT从Stepstone得到了Objective-C全部版权
  • 1996 Steve Jobs重回苹果公司,把OpenStep用于 Mac OS X操作系统开发,它的版本和开发环境叫Cocoa,使用 Objective-C作为基础语言,开发工具Xcode和Interface Builder。
  • 2007 苹果公司推出Objective-C2.0,Objective-C是Mac OS X和 iOS开发的基础语言。

  • Objective-C编程语言排名
    • 2009年 排名32
    • 2010年 排名8
    • 2011年 排名6
    • 2014年 排名3
    • 2015年 排名4(因为Swift一直在上升)
    • 2015年 排名13(因为Swift还在上升)
  • 编程语言排名网站:
    http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html


问题1:OC阶段的学习目标是什么?
答: 学习目标:
语法学习
建立面向对象思维能力
建立基本项目需求分析能力
问题2:OC中主要开发在什么平台上的应用程序?
答:可以使用OC开发Mac OS X平台和iOS平台的应用程序

C和OC对比


本小节知识点

【理解】源文件对比
【掌握】关键字对比
【掌握】数据类型对比
【了解】流程控制语句对比
【掌握】函数(方法)定义和声明对比
【理解】面相对象新增特性
【了解】面向对象新增语法
【了解】新增异常处理


1.源文件对比

  • C语言中常见源文件.h头文件,.c文件
    • .h 头文件,用于存放函数声明
    • .c C语言源文件,用于实现头文件中声明的方法
  • OC中的源文件.h头文件,.m与.mm的实现文件
    • .h 头文件,头文件包含类、方法、属性的声明。
    • .m/.mm 类的实现文件,参与编译的文件,用来实现类中声明的方法

2.关键字对比

  • C语言的关键字都可以在OC源程序中使用
  • OC新增的关键字在使用时,注意部分关键字以"@"开头

3.数据类型对比

  • OC包含C中所有的数据类型;但比C增加了其他几个数据类型,如下:
    BOOL         只有两个取值真YES和假NO
    NSObject *  OC中的对象类型
    id           动态对象类型,万能指针
    SEL          选择器数据类型
    block        代码块数据类型
  • OC中的类

    • Objective-C是一种面向对象的语言,定义类是它的基本能力。
    • 那什么是类呢?类是用来描述对象的,它是一系列方法和属性的集合
    • Objective-C的类声明和实现包括两个部分:接口部分和实现部分。
    • 想要定义方法也就C语言中的函数,那么就必须先有类的存在

4 流程控制语句对比

  • 4.1 C语言中使用的流程控制语句OC中都可以应用
if 语句
switch语句
while语句
do while语句
for语句
break关键字
continue关键字
OC中增加:增强for循环,用于快速迭代数组或者集合
  • 4.2 C语言for循环
for (int i = 0; i < 10; i++){
     printf(“%d”,i);
}
  • 4.3 OC增强for循环
for (NSString *name in NSArray){
     NSLog(@”%@”,name);
}

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

  • 5.1 C语言中函数的声明和实现
    函数声明:int sum(int a,int b);
    函数实现:int sum(int a,int b){ return a+b; }
  • 5.2 OC中的方法
    方法声明:- (int)sum:(int) a andB:(int) b;
    方法实现:- (int)sum:(int) a andB:(int )b{ return a+b; }
注意: 方法只能写在类里面, 而函数可以写在任何地方   
       对象方法,使用对象调用的方法   
       类方法,使用类名调用的方法
  • 5.2.1 对象方法
    - (id)initWithString: (NSString *)name;
  • 5.2.2 类方法

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

6.面相对象特性

封装性
继承性
多态性

7.面向对象新增语法

  • 7.1 属性生成器

      @property
      @synthesize
      //声明属性
      @property (nonatomic,strong)NSString *name;
      //合成属性(实现)
      @synthesize name = _name;
  • 7.2 分类

      分类与继承
      使用分类扩展类,无需子类化
      @interface NSString (MyNSString)
      - (NSString *) encryptWithMD5;
      @end
  • 7.3 协议

      使用协议声明方法
      协议类似于C#,java中的接口
      @protocol MyProtocol
      - (void)myProtocolMethod;
      @end
  • 7.4 Fundation框架
    创建和管理集合,如数组和字典
    访问存储在应用中的图像和其他资源
    创建和管理字符串
    发布和观察通知
    创建日期和时间对象
    操控URL流
    异步执行代码

8.新增异常处理

    用于处理错误信息
    格式:
    @try .... @catch .... @finally
    示例:
    //创建对象car
    Car *car = [Car new];
    @try {
    //调用一个没有实现的方法
    [car test];
    }@catch (NSException *exception) {
        NSLog(@"%@",exception.name);
    }@finally {
        NSLog(@"继续执行!\n");
    }

问题1:OC中新增关键字大部分是以什么开头?

答:OC中新增关键字大部分是以@开头

问题2:OC中新增加了那些数据类型?
答: 
Block 类型
指针类型(Class, id类型)
空类型
特殊类型(SEL, nil)
问题3:面向对象特性是什么?

答: 封装性,继承性,多态性


第一个OC程序


本小节知识点

  1. 如何创建Objective-C项目
  2. 对比#import和#include区别
  3. NSLog 和printf区别
  4. “@”的使用方法
  5. NS前缀

1.如何创建Objective-C项目

  • 1.1 创建工程

  • 1.2 查看结果运行结果


2.#import和#include区别

#import与#include的类似,都是把其后面的文件拷贝到该指令所在的地方
#import可以自动防止重复导入
#import <> 用于包含系统文件
#import""用于包含本项目中的文件
#import , 告诉编译器找到并处理名为Foundation.h文件,这是一个系统文件,#import表示将该文件的信息导入到程序中。
框架地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneO S.sdk/System/Library/Frameworks/

3.NSLog 和printf区别

NSLog是Foundation框架?供的Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出。
NSLog传递进去的格式化字符是NSString的对象,而不是char *这种字符串指针
NSLog输出的内容中会自动包含一些系统信息
NSLog输出的内容会自动换行
//NSLog声明在NSObjCRuntime.h中
//声明:void NSLog(NSString *format, ...);
NSLog(@"this is a test"); //打印一个字符串
NSString *str = @"hello chendehao!";
NSLog(@"string is:%@",str);//使用占位符,%@表示打印一个对象,%@ OC特有的
NSLog(@"x=%d, y=%d",10,20);//使用多个占位符,%d表示整型数

4.“@”的使用方法

@"" 这个符号表示将一个C的字符串转化为OC中的字符串对象NSString.
@符号 OC中大部分的关键字都是以@开头的,比如@interface,@implementation,@end @class等。

5.NS前缀

NS来自于NeXTStep的一个软件 NeXT Software
OC中不支持命名空间(namespace)
NS是为了避免命名冲突而给的前缀
看到NS前缀就知道是Cocoa中的系统类的名称

问题1:#import和#include有什么区别?
答:
1.import 的功能和 include一样, 是将右边的文件拷贝到当前import的位置.
2.import作用:为了降低程序员的负担, 防止重复导入, 避免程序员去书写头文件卫士
3.import优点: 会自动防止重复拷贝
问题2:printf和NSLog有什么区别?
答:
1.NSLog会自动换行
2.NSLog在输出内容时会附加一些系统信息
3.NSLog和printf接收的参数不一样
问题3:Foundation有什么作用?

答:Foundation.h我们称之为主头文件, 主头文件中又拷贝了该工具箱中所有工具的头文件, 我们只需要导入主头文件就可以使用该工具箱中所有的工具, 避免了每次使用都要导入一个对应的头文件

工具箱的地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks
规律: 所有的主头文件的名称都和工具箱的名称一致,所有的主头文件都是导入了该工具箱中所有工具的头文件


面向对象基本概念


本小节知识点

  1. 面向对象基本概念
  2. 面向对象和面向过程区别
  3. 面向对象的特点

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


1.面向对象基本概念

1. 面向对象(Object Oriented,OO)是软件开发方法
2. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
3. Object Oriented Programming-OOP ——面向对象编程

2.面向对象和面向过程区别(重点)

1. 面向对象是相对面向过程而言
2. 面向对象和面向过程都是一种思想
3. 面向过程:强调的是功能行为,关注的是解决问题需要哪些步骤;
4. 面向对象:将功能封装进对象,强调具备了功能的对象,关注的是解决问题需要哪些对象;

3.面向对象的特点

1. 是一种符合人们思考习惯的思想
2. 可以将复杂的事情简单化
3. 将程序员从执行者转换成了指挥者
4. 完成需求时,先要去找具有所需的功能的对象来用。
5. 如果该对象不存在,那么创建一个具有所需功能的对象。
6. 这样简化开发并提高复用。

问题1:什么是面向对象?
  1. 一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。
  2. 通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。
  3. 面向对象 是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
问题2:面向对象和面向过程的区别?(重点)

答:(略,见知识点2)


类与对象


本小节知识点

类与对象的关系


1.类与对象的关系

面向对象的核心就是对象,那怎么创建对象?
OC中创建对象比较复杂, 首先要理解一个概念叫做类.
现实生活中是根据一份描述,一份模板创建对象,编程语言也一样,也必须先有一份描述,在这个描述中说清楚将来创建出来的对象有哪些属性和行为

OC中的类相当于图纸,用来描述一类事物(汽车)。也就是说,要想创建对象必须先有类
OC利用类来创建对象,对象是类的具体存在, 因此面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象.


问题1:什么是对象?

答:对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

问题2:什么是类?

答:具有相同特性(数据元素)和行为(功能)的对象的抽象就是 类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。

问题3:类由几部分组成?(重点)

答:类(Class) 一个类由3个部分构成

  1. 类的名称:类名
  2. 类的属性:一组包含数据的属性
  3. 类的方法:允许对属性中包含的数据进行操作的方法

类的设计


本小节知识点

  1. 如何设计一个类
  2. 如何分析一个类

1.如何设计一个类

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

    如:人有身高,体重等属性,有说话,打架等行为。
    事物名称(类名):人(Person)
    属性:身高(height)、年龄(age)
    行为(功能):跑(run)、打架(fight)

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

    属性:对应类中的成员变量。
    行为:对应类中的成员方法。
    定义类其实在定义类中的成员(成员变量和成员方法)


2.如何分析一个类

  • 一般名词都是类(名词提炼法)
  • 例1:飞机发射两颗炮弹摧毁了8辆装甲车

    包含类别:飞机、炮弹、装甲车

  • 例2:隔壁老王在公车上牵着一条叼着热狗的草泥马

    包含类别:老王、热狗、草泥马

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


第一个OC类


本小节知识点

  1. 如何声明一个类
  2. 如何实现一个类
  3. 如何创建一个对象
  4. 对象的注意点

1.如何声明一个类

    格式:
    @interface MyClass : NSObject
    {   //注意: 默认情况下, OC对象中的属性是不能直接访问的
        //只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性
        @public
        //成员变量(又称实例变量、属性变量)声明
        int         count;
        id          data;
        NSString*   name;
    }
    // 方法声明(什么是方法,后面细讲)
    - (id)initWithString:(NSString *)aName;
    + (MyClass *)myClassWithString:(NSString *)aName;
    @end

注意:

  1. 必须以@interface开头,@end结尾
  2. 成员变量的声明,必须写在@interface与@end之间的大括号中
  3. 方法的声明必须在{}下面,不能写在{}中   

2.如何实现一个类

    格式:
    @implementation MyClass
    - (id)initWithString:(NSString *)aName
    {
    //写代码处
    }
    + (MyClass *)myClassWithString:(NSString *)aName
    {
    //写代码处
    }
    @end

** 注意:**

   1. 必须以@implementation开头,@end结尾
   2. 类名必须和声明的一致

3.如何创建一个对象

  • 用类的方式告诉计算机,我们需要一个什么样的对象,之后我们要在程序中使用这个对象,就必须先创建一个对象
    创建对象格式:
    类名 *指针名 = [类名 new];
  • 注意:[类名 new];做了三件事

    1. 在堆内存中开辟了一块新的存储空间
    2. 初始化成员变量(写在类声明大括号中的属性就叫成员变量,也叫实例变量)
    3. 返回指针地址
  • 消息机制

    1. 使用对象调用方法就是OC中的消息机制
    2. OC中调用方法的格式:[类名或者对象名 方法名];

4.对象的注意点

    1. 可以通过 对象->对象成员(注意声明属性为:@public) 的方式访问对象中的成员;
    2. 每一个对象中都有一份属于自己的属性;
    3. 对其中一个对象的成员进行了修改。和另一个对象没有关系。

对象方法的声明和实现


本小节知识点

  1. 对象方法声明
  2. 对象方法实现

1.对象方法声明

  • 格式
    - (返回值类型)方法名:(参数类型)参数名;
    - (返回值类型)方法名1:(参数类型)参数名1 :(参数类型)参数名2;
    - (返回值类型)方法名1:(参数类型)参数名1 方法名2:(参数类型)参数名2;
    - (返回值类型)方法名1:(参数类型)参数名1 and方法名2:(参数类型)参数名2;
    (多个参数,以最后一种形式类推连接)
  • 特征
   1 对象方法以-开头如 -(void)xx;   
   2 对象方法只能由对象来调用
   3 对象方法中可以访问当前对象的成员变量
   4 调用格式 [对象名 对象方法名];   
  • 示例:
    //声明没有返回值的对象方法
    - (void)method;
    //声明有返回值的对象方法
    - (int)method;
    //声明有返回值有参数的对象方法
    - (int)method: (int)var;
    //声明有返回值有多个参数的对象方法
    - (int)method: (int)var1 andVar2: (int)var2;

2.对象方法实现

   1 必须写在以@implementation开头,@end之间
   2 在声明的后面加上{}即表示实现
   3 将需要实现的代码写在{}中

问题1:方法和函数的区别?
 1. OC中的行为和C语言中的函数一样, 都是用来保存一段特定功能的代码    
    C语言中定义一个函数, 分为声明和实现, 声明写在.h中, 实现写在.c中   
    OC中定义一个方法, 也分为声明和实现, 声明写在@interface中, 实现写在@implementation中
 2. C语言的函数分为两种: 内部函数和外部函数   
    OC中的方法也分为两种; 类方法和对象方法
问题2:怎么声明和实现无参无返回值方法的?调用方法的格式?(书写格式)
  //1.方法的声明格式:
  - (返回值类型)方法名;
  //2.方法的实现格式:
  - (返回值类型)方法名{
  }
  //3.调用方法格式:
  [对象名 对象方法名];
  或者 [类名 类方法名];
问题3:小括号在OC方法中有什么用法?

答:OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的


类方法的声明和实现


本小节知识点

  1. 类方法声明
  2. 类方法实现
  3. 对象方法和类方法区别

1.类方法声明

  • 格式:

    将对象方法-号变为+号

  • 1.2 特征:

    1. 类方法以+开头 如+(void)put;
    2. 类方法只能由类来调用
    3. 类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量。
  • 1.3 类方法的好处:

    1. 节省内存空间;
    2. 不依赖于对象,执行效率更高;
    3. 能用类方法解决的问题,尽量使用类方法;
  • 1.4 类方法的场合:

    1. 当方法内部不需要使用到成员变量时,可以改为类方法(效率高)
    2. 类方法一般用于编写工具方法
      2.1. 字符串查找
      2.2. 文件操作
      2.3. 数据库操作
  • 1.5 示例:

//声明没有返回值的类方法
+ (void)method;
//声明有返回值的类方法
+ (int)method;
//声明有返回值有参数的类方法
+ (int)method: (int)var;
//声明有返回值有多个参数的类方法
+ (int)method: (int)var1 andVar2: (int)var2;

2.类方法实现

1. 必须写在以@implementation开头,@end之间
2. 在声明的后面加上{}即表示实现
3. 将需要实现的代码写在{}中

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

  • 3.1 对象方法

    1. 对象方法是属于对象的
    2. 以减号-开头
    3. 只能让对象调用,没有对象,这个方法根本不可能被执行
    4. 对象方法能访问实例变量(成员变量)
    5. 对象方法中可以调用当前对象的对象方法
    6. 对象方法中可以调用其他对象的对象方法
    7. 对象方法中不可以调用类方法
  • 3.2 类方法

    1. 类方法是属于类的
    2. 以加号+开头
    3. 只能用类名调用,对象不能调用
    4. 类方法中不能直接访问实例变量(成员变量)
    5. 类方法中不能直接调用对象方法,要想调用对象方法,必须创建或传入对象。
  • 3.3 使用场合:

    1. 当不需要访问成员变量的时候,尽量用类方法(效率高)
    2. 类方法和对象方法可以同名

4.类方法和对象方法可以进行相互调用

  1. 对象方法中可以直接调用类方法
  2. 类方法中间接调用对象方法 (注意: 不建议这样使用)
  3. 类方法中可以直接调用其它类方法
  4. 对象方法中可以直接调用对象方法


问题1:类方法和对象方法的区别?

  • 对象方法以-开头, 类方法以+开头
  1. 对象方法必须用对象调用, 类方法必须用类来调用
  2. 对象方法中可以直接访问属性(成员变量), 类方法中不可以直接访问属性(成员变量)
  3. 类方法和对象方法可以进行相互调用
    3.1. 对象方法中可以直接调用类方法
    3.2. 类方法中间接调用对象方法 (注意: 不建议这样使用)
    3.3. 类方法中可以直接调用其它类方法
    3.4. 对象方法中可以直接调用对象方法

问题2:类方法的应用场景?

  • 当方法内部不需要使用到成员变量时,可以改为类方法
  • 类方法一般用于编写工具方法

    1. 字符串查找
    2. 文件操作
    3. 数据库操作

对象的存储细节


本小节知识点

  1. 对象的存储细节
  2. isa指针
  3. 使用一个类创建多个对象

1.对象的存储细节

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


2.isa指针

创建对象的时候返回的地址其实就是类的第0个属性的地址
但是需要注意的是: 类的第0个属性并不是我们编写的第一个成员变量, 而是一个叫做isa的属性
每一个对象都包含一个isa指针.这个指针指向当前对象所属的类;
isa是一个指针, 占8个字节
通过isa指针我们可以在运行的时候知道当前对象是属于那个Class(类)的.


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

Car *car1 = [Car new];
Car *car2 = [Car new];
  • 其实类也是一个对象, 也就意味着Car也是一个对象;
  • 平时我们所说的创建对象其实就是通过一个 类对象 来创建一个 新的对象(又称:实例对象)
  • 类对象是系统自动帮我们创建的, 里面保存了当前对象的所有方法
  • 实例对象是程序自己手动通过new来创建的, 而实例对象中有一个isa指针就指向了创建它的那个类对象;
  • [car1 start];表示给car1所指向的对象发送一条start消息,调用对象的start方法,此时对象会顺着内部的isa指针找到存 储于类中的方法,执行。

局部变量和全局变量以及成员变量对比


问题:什么是成员变量?什么是全局变量?什么是局部变量?三者的区别?

  • 1.成员变量:写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)

    1. 成员变量只能通过对象来访问
    2. 成员变量不能离开类, 离开类之后就不是成员变量,成员变量不能在定义的同时进行初始化
    3. 存储: 堆(当前对象对应的堆的存储空间中)
    4. 存储在堆中的数据, 不会被自动释放, 只能程序员手动释放
  • 2.全局变量:写在函数和大括号外部的变量, 我们称之为 全局变量

    1. 作用域: 从定义的那一行开始, 一直到文件末尾
    2. 局部变量可以先定义在初始化, 也可以定义的同时初始化
    3. 存储: 静态区
    4. 程序一启动就会分配存储空间, 直到程序结束才会释放
  • 3.局部变量:写在函数或者代码块中的变量, 我们称之为 局部变量

    1. 作用域: 从定义的那一行开始, 一直到遇到大括号或者return
    2. 局部变量可以先定义再初始化, 也可以定义的同时初始化
    3. 存储 : 栈
    4. 存储在栈中的数据有一个特点, 系统会自动给我们释放

函数与方法对比


函数与方法对比

  • 方法:

    1. 方法的实现只能写在@implementation...@end中,方法的声明只能写在 @interface...@end中间
    2. 对象方法都以-号开头,类方法都以+号开头
    3. 对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
    4. 函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。
    5. 对象方法归类\对象所有
  • 函数:

    1. 所有的函数都是平行的
    2. 函数不存在隶属关系
    3. 使用的时候可以直接调用
    4. 不可以访问对象中的成员变量

问题1:函数和方法的区别?
  1. 函数属于整个文件,方法属于某一个类,方法如果离开类就不行
  2. 函数可以直接调用, 方法必须用对象或者类来调用
  3. 不能把函数当做方法来调用, 也不能把方法当做函数来调用

注意: 虽然函数属于整个文件, 但是如果把函数写在类的声明中会不识别

问题2:方法有哪些的注意点?

1 方法可以没有声明只有实现
2 方法可以只有声明没有实现, 编译不会报错, 但是运行会报错
如果方法只有声明没有实现, 那么运行时会报:
reason: '+[Person demo]: unrecognized selector sent to class 0x100001140'
发送了一个不能识别的消息, 在Person类中没有+开头的demo方法
reason: '-[Person test]: unrecognized selector sent to instance 0x100400000'

补充1:类也有一个注意点:

类可以只有实现没有声明
注意: 在开发中不建议这样写


常见错误

  1. 只有类的声明,没有类的实现
  2. 漏了@end
  3. @interface和@implementation嵌套
  4. 成员变量没有写在括号里面
  5. 方法的声明写在了大括号里面
  6. 成员变量不能在{}中进行初始化、不能被直接拿出去访问
  7. 方法不能当做函数一样调用
  8. OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  9. C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  10. C函数不能访问OC对象的成员
  11. 低级错误:方法有声明,但是实现的时候写成了函数
  12. OC可以没有@interface同样可以定义一个类

转载于:https://www.cnblogs.com/cdhao/p/5464025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值