10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强

一、    分类-Category

1.        基本用途


  • OC中如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式

  1>.继承

  2>.分类(Category)

2.        格式


  • 分类的声明

@interface 类名 (分类名称)

// 方法声明

@end

  • 分类的实现

@implementation 类名 (分类名称)

// 方法实现

@end

3.        好处


  • 一个庞大的类可以分模块开发,可以由多个人来编写,更有利于团队合作

  • 给系统自带的类添加分类,例如:

    给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数

    给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数


#import <Foundation/Foundation.h>

@interface NSString (Number)

+ (int)numberCountOfString:(NSString *)str;

- (int)numberCount;

@end

NSString+Number.h


#import "NSString+Number.h"

@implementation NSString (Number)

+ (int)numberCountOfString:(NSString *)str
{
return [str numberCount];
}

- (int)numberCount
{
int count = 0;
for (int i = 0; i<self.length; i++)
{
// 取出i这个位置对应的字符
unichar c = [self characterAtIndex:i];

// 如果这个字符是阿拉伯数字
if ( c>=‘0‘ && c<=‘9‘ )
{
count++;
}
}
return count;
}

@end

NSString+Number.m

5.        注意


  • Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类

  • Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法

  • 多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效


二、    类对象(类的本质)

1.        类也是个对象


  • 其实类也是一个对象,是Class类型的对象,简称“类对象”

  • Class类型的定义

typedef struct objc_class *Class;

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

2.        +load和+initialize


  • +load

l  
在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

l  
先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

l   先加载原始类,再加载分类

l   不管程序运行过程有没有用到这个类,都会调用+load加载

  • +initialize

  l   在第一次使用某个类的时候(比如创建对象等),系统就会调用一次+initialize方法(且只能调用一次)

  l   先调用父类的,再调用子类的

3.        获取类对象的2种方式

Class c = [Person class]; // 类方法

或者

Person *p = [Person new];

Class c2 = [p class]; // 对象方法

4.        类对象调用类方法

Class c = [Person class];

Person *p2 = [c new];   // ps: 不能直接调用对象方法


三、    description方法

1.     -description方法


使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出
 默认输出<类名:对象地址>

2.     + description方法

使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

3.     修改NSLog的默认输出


  • 重写-description或者+description方法即可

4.     死循环陷阱


  • 如果在-description方法中使用NSLog打印self


- (NSString *)description
{
// 下面这行代码会引发死循环
NSLog(@"%@", self); // 要打印出self的对象类名及地址 首先就会去调用description对象方法 如此就造成死循环
return @"57576768";
}


四、    SEL

1.        方法的存储位置


  • 每个类的方法列表都存储在类对象中

  • 每个方法都有一个与之对应的SEL类型的对象

  • 根据一个SEL对象(相当于方法的指针)就可以找到方法的地址,进而调用方法

  • SEL类型的定义

typedef struct objc_selector    *SEL;

2.        SEL对象的创建

SEL s = @selector(test);    // s即为 test方法的指针*

SEL s2 = NSSelectorFromString(@"test");

3.        SEL对象的其他用法

// 将SEL对象转为NSString对象

NSString *str = NSStringFromSelector(@selector(test));

Person *p = [Person new];

// 调用对象p的test方法

[p performSelector:@selector(test)];  //
performSelector方法为:执行哪一个SEL对象


五、    NSLog输出增强

  • __FILE__ :源代码文件名

  • __LINE__ :NSLog代码在第几行

  • _cmd :代表着当前方法的SEL

// 下面的代码会引发死循环

- (void)test {

[self performSelector:_cmd];

}

10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强,码迷,mamicode.com

时间: 2024-08-12 17:31:10

10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强的相关文章

类的本质、description方法、SEL、NSLog输出增强

一.类的本质 1.类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class *Class; 类名就代表着类对象,每个类只有一个类对象 2.+load和+initialize +load 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法 先加载父类,再加载子类:也就是先调用父类的+load,再调用子类的+load 先加载元原始类,再加载分类 不管程序运行过程有没有用到这个类,都会调用+

Python3.2官方文档翻译-- 类定义语法和类对象

6.3 初识类 类引入一些新语法:三种新的对象类型和一些新的语义. 6.3.1 类定义语法 类定义的最简单形式如下: class ClassName: <statement-1> . . . <statement-N> 类定义和函数定义(def语句)一样,必须先执行然后才生效.(你当然可以把类定义放在if语句分支中或者嵌入在函数中) 在实际情况中,在类定义中的语句常常是方法的定义,但是其他语句也是允许的并且有时是很有用的---以后我们会讨论到这点.在类中的定义方法通常有一个参数列表

黑马程序员——OC的特有语法

1. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ? 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Category) 2. 格式 ? 分类的声明 @interface 类名 (分类名称) // 方法声明 @end ? 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end 3. 好处 ? 一个庞大的类可以分模块开发 ? 一个庞大的类可以由多个人来编写,更有利于团队合作 ? 4

【黑马程序员】————OC特有语法

一.点语法 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age]; 二.成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在

OC中的特有语法

一. 分类-Category 1. 基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 l 继承 l 分类(Category) 2. 格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end 3. 好处 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作 给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数 给NSStr

6.0 OC基础语法-特有语法

分类-Category基本用途如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式继承分类(Category) 格式分类的声明@interface 类名 (分类名称)// 方法声明@end分类的实现@implementation 类名 (分类名称)// 方法实现@end 好处一个庞大的类可以分模块开发一个庞大的类可以由多个人来编写,更有利于团队合作 给系统自带的类添加分类给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数给NSString增加一个对象方法:计算当前字符串中

黑马程序员— OC基本语法、类和对象、三大特性

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲     OC简介及基本语法 Objective-C简称OC是在C语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,也就是可以在OC代码中混入C语言代码,甚至是C++代码.可以使用OC开发Mac OS X平台和IOS平台的应用程序.简单的介绍了一下OC,下面我们来看看OC的基本语法,学习OC之前我们先学习了C语言,因为OC是在C语言的基础上的一门开发语言,因此OC的很多基本语法

黑马程序员-OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如下 // 声明 @interface  类名  (分类名称) @end // 实现 @implementation 类名 (分类名称) @end 2:分类的好处,当一个类比较庞大时,不同的部分可以放到不同的分类中,也方便团队中类的开发: 3:分类使用注意: a:分类不能增加成员变量,只能对原类增加方

Objective-C 笔记二 类、对象和方法

对象就是一个物件.面向对象的程序设计可以看成一个物件和你想对它做的事情.这与C语言不同,C语言通常称为过程性语言.在C语言中,通常是先考虑要做什么,然后才关注对象,这几乎总是与面相对象的思考过程相反. 在面向对象的用语中,(这里我们以汽车作为对象)你的汽车是汽车的一个实例.car就是类的名称,这个实例就是从该类创建的.因此,每制造一辆新汽车,就会创建汽车类的一个新实例,而且汽车的每个实例都称为一个对象. 对象 使用对象执行的操作 你的汽车 驾驶 加油 洗车 维修 每个实例或对象不仅包含从制造商那