分类(Category):可以给某一个类扩充一些方法(不修改原来类的代码)

 作用:在不改变原来类内容基础上,可以为类增加一些方法

 使用注意:

1. 只能增加方法,不能增加成员变量

2. 分类方法实现中可以访问原来类中的成员变量

3. 分类可以重新实现原来类中的方法,会覆盖原来类的方法,导致原来类的方法无法再使用

4. 分类的优先级最高:调用一个方法优先去分类中找,再去原来类,然后父类中找

  分类(最后编译的优先)—》原来类—》父类

声明:

@interface 类名(分类名称)

@end

实现:

@implementation 类名

@end

类的本质:

类本身也是一个对象,是Class类型的对象,简称类对象

Class类型的定义

typedef struct objc class *Class

类名代表着类对象,每个类只有一个类对象

+load方法和+initialize方法:

1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。

2.当第一次使用某个类时,就会调用当前类的+initialize方法,一个类只会调用一次+initialize方法

3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法

description方法

使用NSLog输出属性较多时,修改默认输出,可重写+description方法或-desription方法

+description方法:

默认情况下,使用NSLog和%@输出对象时,调用对象的-desription方法,拿到的返回值(NSString *)屏幕输出结果是:<类名:内存地址>

+desription方法:

默认情况下,使用NSLog和%@输出类对象时,调用类对象的+desription方法,拿到的返回值(NSString *)屏幕输出

注意点:

不要在-desription方法中尝试使用self,会造成死循环

NSLog打印

1. %p

   打印指针变量p的地址

  NSLog(@"%p", &p);

    打印对象地址

NSLog(@"%p", p);

2. %@

  %@ 打印<类名:对象地址>

  NSLog(@"%@", p);

3.  _LINE_     %d    输出当前行号

4.  _FILE_      %s    输出文件路径

5.  _func_      %s    输出当前函数

SEL

全称selector

SEL 其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法

_cmd 代表当前方法

消息就是SEL

#import <Foundation/Foundation.h>

@interface Person : NSObject

+ (void)test;

- (void)test1;
- (void)test2:(NSString *)abc; @end @implementation Person
+ (void)test
{
NSLog(@"+test+++++++"); } - (void)test1
{
NSLog(@"-test-------");
} - (void)test2:(NSString *)abc
{
NSLog(@"test2----%@", abc); }
@end int main()
{
Person *p = [[Person alloc] init]; NSString *name = @"test1";
SEL s = NSSelectorFromString(name); [p performSelector:s]; // [Person test];
// [p test1];
// 1.把test1包装成SEL类型的数据
// 2.根据SEL数据找到对应的方法地址
// 3.根据方法地址调用对应的方法 // 间接调用test1
// [p performSelector:@selector(test1)];
// [p performSelector:@selector(test2:) withObject:@"123"]; return ;
}

Objective-C( 语法二)的更多相关文章

  1. PHP语法(二):数据类型、运算符和函数

    相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 这次整理了PHP的数据类型.运算符和函数. ...

  2. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  3. web前端学习python之第一章_基础语法(二)

    web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  4. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  5. CodeSmith 基本语法(二)

    CodeSmith之四 - 典型实例(四) CodeSmith API文档 (三) CodeSmith 基本语法(二) CodeSmith 图形界面基本操作(一) CodeSmith的C#语法与Asp ...

  6. Pocket英语语法---二、指示代词和不定代词是什么

    Pocket英语语法---二.指示代词和不定代词是什么 一.总结 一句话总结: 指示代词:标识人或事物的代词,用来代替前面已提到过的名词 this.these.that.those不定代词:指代不确定 ...

  7. Vue模板语法(二)

    Vue模板语法(二) 样式绑定  class绑定 使用方式:v-bind:class="expression" expression的类型:字符串.数组.对象 1.2 style绑 ...

  8. Shell系列(36)- for循环语法二简介及批量添加删除用户

    for循环语法二 for ((初始值;循环控制条件;变量变化)) do 程序 done 例子 例子-1 求和工具 需求:根据用户输入的数字,求1~输入所有数字的和 脚本: #!/bin/bash re ...

  9. Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

随机推荐

  1. 安装vim

    命令安装vim sudo apt-get install vim

  2. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  3. 25条提高iOS app性能的方法和技巧

    以下这些技巧分为三个不同那个的级别---基础,中级,高级. 基础 这些技巧你要总是想着实现在你开发的App中. 1. 用ARC去管理内存(Use ARC to Manage Memory) 2.适当的 ...

  4. 蓝灯(lantern)在服务器(vps)上运行

    蓝灯(lantern)在无界面的linux下运行的时候,会遇到一个错误: error while loading shared libraries: libappindicator3.so.1: ca ...

  5. Android动画Drawable Animation

    Drawable Animation是逐帧动画,那么使用它之前必须先定义好各个帧.我们可以通过代码定义,也可以使用xml文件定义,一般使用后者.如下: <?xml version="1 ...

  6. TCP/IP协议(二)

    2014-09-04 11:03:27   注:关于seq 和 ack 的理解,seq为发送的字节的第一个序号,一直累加,ack接收字节的最后一个序号+1,建立连接和结束连接时的SYN.FIN标志位占 ...

  7. [问题2014A13] 解答

    [问题2014A13]  解答 先引入两个简单的结论. 结论 1  设 \(\varphi\) 是 \(n\) 维线性空间 \(V\) 上的线性变换, 若存在正整数 \(k\), 使得 \(\math ...

  8. Android 自动化测试 Emmagee

    Emmagee 是一个性能测试小工具 用来监控指定被测应用在使用过程中占用机器的CPU, 内存,流量资源的性能小工具 阅读目录 Emmagee 介绍 Emmagee是网易杭州研究院QA团队开发的一个简 ...

  9. 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)

    利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...

  10. InputStream,BufferedImage与byte数组之间的转换

    需要获取网络的一张图片,但是某种需要,要把获取的这段流输入换为BufferedImage流,有的地方还需要转换为byte[]. 获得图片地址,获得了一个图片输入流,例如:    Url img = n ...