黑马程序员——OC扩充数据类型

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

扩充数据类型

1.SEL(方法地址)

SEL:类中的方法包装成的数据,运行时候会存在与缓存中。

SEL在Object-C中定义:

typedef  struct objc_selector  *SEL;

①SEL属于运行时机制

②类中的每个方法(对象方法及类方法)都对应一个SEL数据

③调用方法时,将方法名包装成一个SEL数据,然后进入类中查找SEL(方法地址),调用方法

④每个SEL对应一个方法地址。

⑤带参数的方法,用selector包装方法时,方法名后面要有一个冒号“:”。

⑥每个方法内部都有个隐藏的SEL数据_cmd,_cmd代表当前方法,是系统自带的。

实例示范: 

main.m文件

#import <Foundation/Foundation.h>
#import "Student.h"
int main()
{

    Student *stu = [[Student alloc]init];
    SEL sel_test = NSSelectorFromString(@"test");//将字符test转换为SEL数据
    //以下通过SEL数据调用方法,说明每个方法有一个对应的SEL数据(方法地址)
    [stu performSelector:sel_test];//通过SEL数据调用test方法
    //将方法名为test1:封装成SEL数据,通过SEL数据调用test1方法
    [stu performSelector:@selector(test1:) withObject:@"Hua_san"];
    [Student test];
    return 0;
}

Student.h文件

#import <Foundation/Foundation.h>

@interface Student : NSObject
+ (void) test;
- (void) test;
- (void) test1:(NSString *)str;
@end

Student.m文件

#import "Student.h"

@implementation Student
+(void)test
{
    SEL sel = _cmd;//每个方法中都有一个隐藏的SEL数据_cmd,_cmd代表着当前方法
    NSString *str_sel = NSStringFromSelector(sel);//将sel转换为NSString数据类型
    NSLog(@"test类方法中_cmd代表的方法名:%@",str_sel);
}
-(void)test
{
    NSLog(@"This is test");
}

-(void)test1:(NSString *)str
{
    NSLog(@"This is test1----参数:%@",str);
}
@end

结果输出:

2015-04-25 09:01:24.363 05-数据类型相互转换[624:26953] This is test
2015-04-25 09:01:24.364 05-数据类型相互转换[624:26953] This is test1----参数:Hua_san
2015-04-25 09:01:24.364 05-数据类型相互转换[624:26953] 查看了类方法test中_cmd代表的方法名:test

2.Block(代码块)

*什么是Block?

Block 是iOS在4.0之后新增的程式语法,是用来封装一段代码,任何时候都可以执行。其有点类似函数,与函数不同的是:Block可以在运行时动态保存一段代码,函数必须是编译前写好,使用block使程序运行高效,所以苹果官方特别推荐使用。

*Block与函数

相同点:

①可以保存一段代码,随时调用

②可以有参数与返回值

③调用方式相同

不同点:

①函数只能保存静态代码,编译前要写好,而block可以保存动态代码,其要保存代码可以是程序运行时动态产生的。

②定义block时,如果block没有形参时候,后面的小括号可以省略

③block可以访问局部变量,不可以修改局部变量,函数可以访问与修改局部变量

实例示范: 

函数举例:

#import <Foundation/Foundation.h>
typedef int (*Number)(int,int);//声明一个返回值为int类型,有两个int参数的指针,名字为Number

int Max(int a,int b)
{
    return a>b?a:b;
}
int Min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int a = 10,b = 20;
    Number max = Max;//用max指针指向Max函数
    Number min = Min;//用min指针指向Min函数
    NSLog(@"max(%d,%d) = %d",a,b,max(10,20));
    NSLog(@"min(%d,%d) = %d",a,b,min(a,b));
    return 0;
}

block举例:

#import <Foundation/Foundation.h>
typedef int (^Number)(int,int);//声明一个返回值为int类型,有两个int参数的block,名字为Number
int main()
{
    int a = 10,b = 20;
    Number max = ^(int a,int b){return a>b?a:b;};//定义一个max的block
    Number min = ^(int a,int b) {return a<b?a:b; }; //定义一个min的block
    NSLog(@"max(%d,%d) = %d",a,b,max(10,20));
    NSLog(@"min(%d,%d) = %d",a,b,min(a,b));
    return 0;
}

结果输出:

2015-04-25 09:56:44.011 06-Block[754:43626] max(10,20) = 20
2015-04-25 09:56:44.013 06-Block[754:43626] min(10,20) = 10

课堂笔记

1.SEL

① 方法的存储位置

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

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

?   根据一个SEL对象就可以找到方法的地址,进而调用方法

?   SEL类型的定义

typedef
struct
objc_selector    *SEL;

②SEL对象的创建

SEL s =
@selector(test);

SEL s2 = NSSelectorFromString(@"test");

③SEL对象的其他用法

// 将SEL对象转为NSString对象

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

Person *p= [Person
new];

//调用对象p的test方法

[p performSelector:@selector(test)];

2.Block

lBlock封装了一段代码,可以在任何时候执行

lBlock可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

l苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

//定义一个min的block

int  (^min) (int ,int) = ^(int a,int
b)  {  return a<b?a:b;  };

//调用一个block,与函数调用一致

min(10,20);

Block可以访问局部变量,但是不能修改。

intsum=10;

int(^MyBlock)(int)= ^(intnum){

sum++;//编译报错

returnnum* sum;

};

如果要修改就要加关键字:__block

__block intsum
= 10;

时间: 2024-10-09 17:54:23

黑马程序员——OC扩充数据类型的相关文章

黑马程序员 oc与c的区别,联系

1.文件的扩展名的区别       1>c语言源文件的扩展名是.c,而oc的扩展名是.m       2>c语言经过编译之后得到的目标模块扩展名是.obj,而oc编译之后是.o       3>c语言目标程序与其他目标程序和库函数经过连接得到可执行文件的扩展名是.exe,而oc是.out2.两者的编程思想是不同的        c语言是面向过程的编程语言,oc是面向对象的编程语言3.oc语言对于c语言的拓展       oc是面向对象的编程语言,它的基本数据类型比c语言多了个bool类型

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员-oc对象的内存管理

oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理: oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象:当计数器为0时该对象会从内存中释放: 相关方法和概念: 1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身: 2:release:没有返回值,计数器-1: 3:retainCount:获取当前计数器的值: 4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dea

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

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

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员-OC内存管理 @property的增强

涉及到内存管理,只读,多线程等很多功能时,setter和getter方法也就没那么简单了:当然@property依然强大,很好用: 1:内存管理相关参数: *:retain:  (如果是oc对象类型),生成的setter会自动release旧值,retain新值: *:assign:(适用于非oc对象)  这个是默认的值 *:copy:release旧值,copy新值: @property (retain) NSString *name; // 同类型的参数不能同时写 // @property

黑马程序员-OC self super isa指针

self指针: self是oc面向对象设计中的一个特殊指针,相当于java中的this,但是比this强大,this只能访问实例对象的相关方法和成员变量,或者说this只代表实例对象: self不仅可以代表实例对象,还可以代表类对象:谁调用当前方法,self就代表谁:如果self用在了以"-"号的方法中,也就是对象方法中,那么就代表实例对象,若果在"+"号开头的方法中,self就代表类对象,因为只有类对象才能调用以"+"号开头的方法: self调

黑马程序员-OC面向对象继承关系和组合关系笔记

继承关系是描述类和类之间的关系,两个类分别称为子类和父类,子类继承了父类,子类就拥有了父类的属性和方法: 继承的关系特点描述出来就是:** "是" **  (例如:学生类 是 人类) 组合关系描述的语句是:**** "拥有" ***  (例如:学生有成绩这个属性,而成绩属性本来就是一个成绩类的对象 ) 继承示例代码: #import <Foundation/Foundation.h> //Animal类的声明 @interface Animal : NS

黑马程序员-OC学习笔记之block

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9426    Accepted Submission(s): 4151 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par