------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、 ARC
ARC是一种编译器特性:编译时编译器帮助完成代码 ,区分于垃圾回收。ARC判断准则:没有强指针指向对象时,会释放对象。
1.ARC特点
1> 不允许调用release、retain、retainCount
2> 能重写dealloc,但是能调用[super dealloc]
3> @property的参数
* strong :成员变量是强指针(适用于OC对象类型)
* weak :成员变量是弱指针(适用于OC对象类型)
* assign : 适用于非OC对象类型
4> 以前的retain改为用strong
2. 指针分为强指针和弱指针:
1> 强指针:默认,所有的指针都为强指针 __strong
2> 弱指针:__weak
3.使用ARC处理循环引用:
当两端循环引用的时候,解决的方法:
1. 使用ARC修改@property参数:一端用strong, 一端用weak
2.非ARC
修改@property参数: 一端用retain另一端用assign
代码示例:
@class Dog ;
@interface Person :NSObject // Person 类中
@property (nonatomic , strong) Dog *dog ;
@end
@class Person
@interface Dog :NSObject // Dog 类中
@property (nonatomic , weak) Person *person ;
@end
二、block
1 block简述
* block是OC特有的一种数据类型,在开发中经常使用。
* block用来保存一段代码
* block的标志是^
2 block与函数类似:
* 可以用来保存代码
* 并且有返回值
* 有形参
3.调用的方式与函数一样
定义方法如下
int (^sumBlock)(int , int); // 先对其进行声明
sumBlock = ^(int a , int b ) // 对其赋值
{
return a + b ;
};
还有另一种写法在声明的同时进行赋值
int (^minusBlock)(int , int) = ^(int a, int b) // 声明的同时对其赋值
{
return a - b ;
};
使用 block 进行打印出N条线
// 使用block打印n条线
void (^lineBlock)(int) = ^(int n)
{
for (int i = 0 ; i < 0 ; i++)
{
NSLog(@"----------") ;
}
};
lineBlock(6) ; // n = 6 , 打印6条横线
4.用typedef 定义block数据类型
typedef int (^TaBlock)(int a , int b ) ; // 后面可以使用TaBlock这种类型定义block变量
5.block 定义函数指针
// 指向函数的指针
int (*p)(int , int ) = sum ;
int d = p(10, 100);
1.协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表...
@end
2 . 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
// 一个协议遵守了另外一个协议,就拥有了另一个协议的所有方法声明
@interface Myprotocol <Myprotoco13 , Myprotoco12>
@end
3.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,就会发出警告。
2> @optional
4. 定义一个变量,限制这个变量保存的对象遵守某个协议
类名 <协议名称> *变量名;
id <协议名称> 变量名;
NSObject <MyProtocol> *c;
id <MyProtocol> c1;
如果没有协议对应的协议,编译器会报警。