特有语法2
一、 分类-Category
1. 基本用途
如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式
继承
分类(Category)
2.格式@interface 类名 (分类名称)
// 方法声明
@end
分类的实现
@implementation 类名 (分类名称)
// 方法实现
@end
3.好处一个庞大的类可以由多个人来编写,更有利于团队合作
给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数
5.注意
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。
Category可以实现原始类的方法,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
Class类型的定义:
typedef struct objc_class *Class;
类名就代表着类对象,每个类只有一个类对象,就是他本身先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
先加载元原始类,再加载分类
不管程序运行过程有没有用到这个类,都会调用+load加载
+initialize-在第一次使用某个类时,就会调用一次+initialize方法
一个类只会调用一次+initialize方法,先调用父类的,再调用子类的
Class c = [Person class];
Person *p2 = [c new];
三.descrip每个方法都有一个与之对应的SEL类型的对象
根据一个SEL对象就可以找到方法的地址,进而调用方法
SEL类型的定义:
SEL s2 = NSSelectorFromString(@"test");
Person *p = [Person new];
[p performSelector:@selector(test)]; // 调用对象p的test方法
__LINE__ :NSLog代码在第几行
_cmd :代表着当前方法的SEL
六.protocol
可以用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
只要父类遵守了某个协议,就相当于子类也遵守了
协议的编写
@protocol 协议名称
@end
某个类遵守协议
@interface 类名 : 父类 <协议名称>
@end
3.关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required)
@required:这个方法必须要实现@optional:这个方法不一定要实现
4.协议遵守协议
一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开
一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
@protocol 协议名称 <协议1, 协议2>
@end
5.基协议
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法如:description、retain、release....
七.Block
1.用处
Block封装了一段代码,可以在任何时候执行
Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
2.定义
int (^MySum)(int, int) = ^(int a, int b) {
return a+b;
};
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
int sum = 10;
int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
};
如果要修改就要加关键字:__block
__block int sum = 10;
3.block的赋值
在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
也可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
八.ARC
1.基本简介
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的 retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管 理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
2.基本原理
ARC 的规则:只要还有一个强指针变量指向对象,对象就会保持在内存中
3.使用注意
不能调用release、retain、autorelease、retainCount
可以重写dealloc,但是不能调用[super dealloc]
@property : 想长期拥有某个对象,应该用strong,其他对象用weak
其他基本数据类型依然用assign
两端互相引用时,一端用strong、一端用weak
-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------------