Objective-C---ARC、block、协议

10 篇文章 0 订阅


一、ARC


          --> ARC是自iOS5之后增加的新特性,完全消除了手动管理内存的烦琐

                编译器会自动在适当的地方插入适当的retain、release、autorelease语句;
          --> ARC是编译器特性--编译代码的时候,编译器会自动检测哪里需要插入释放内存的代码,自动生成代码

                因此ARC和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化

 

          ARC基本原理

 

 

                  ARC的判断规则:

                    只要还有一个强指针变量指向对象,对象就会保存在内存中

                  (只要没有强指针指向对象,就会释放对象)

       强指针与弱指针

 

                 强指针:默认情况下,所有的指针都是强指针,__strong;

              弱指针:__weak;

              弱指针指向的对象被回收(释放)后,弱指针会自动变为nil指针(空指针),不会引发野指针错误。

 

 

 

     ARC 的特点

 

               -->  不允许调用release、retain、autorelease、retainCount;

               --> 允许重写dealloc,但是不能调用[super dealloc];

               --> @property参数:

 

               strong:想长期拥有某个对象,成员变量是强指针(适用于OC对象类型);

              weak:成员变量是弱指针(适用于OC对象类型);

              assign:适用于基本数据类型(非OC对象类型)。

 

          手动管理内存@property参数里的retain改为用strong。

 

 

二、block

 

         block是一种数据类型,苹果官方推荐使用,效率高

         block用来保存一段代码,标志是^

         block与函数有些类似,可以保存代码,有形参和返回值

 

         定义block变量

int (^sumblock)(int, int)
void (^myblock1)()

        block内部可以访问外面的变量

        默认情况下,block内部不能修改外面的局部变量

        给局部变量加上__block关键字,这个局部变量就可以在block内部修改

 

            利用typedef定义block类型

 typedef int (^MyBlock)(int, int);
 //利用MyBlock类型类定义Block变量
 MyBlock b1, b2;
 b1 = ^{    
  NSLog(@"---------");
  NSLog(@"---------");
 };
 MyBlock b3 = ^(int a, int b){
  return a + b
 };


 

// 无参无返回值block
void test()
{
	// 定义block变量,如果没有形参,可以省略等号右侧空的括号
	void (^myblock1)() = ^(){    
		NSLog(@"---------");
		NSLog(@"---------");
	};

	// 利用block变量调用block内部的代码
	myblock1();
}

// 有参有返回值block
void test2()
{
	int (^sumblock)(int, int) = ^(int a, int b){
		return a + b
	};

	sumblock(10, 20);

	// 用一个block输出n条横线
	void (^printLineBlock)(int) = ^(int n){
		for(int i = 0; i < n ; i++)
		{
			NSLog(@"----------");
		}
	};

	printLineBlock(5);
}



 

三、protocol协议

 

       基本用途

                 --> 可以用来声明一大堆方法(不能声明成员变量);

                 --> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明;

                 --> 只要父类遵守了某个协议,就相当于子类也遵守了。

 

        格式:

//协议的编写
@protocol 协议名称
// 方法声明列表
@end
//某个类遵守协议
@interface 类名 : 父类 <协议名称>
@end


 

       关键字

                协议中有2个关键字可以控制方法是否要实现(默认是@required)

                 在大多数情况下,用途在于程序员之间的交流;

                @required:

                                 这个方法必须要实现(若不实现,编译器会发出警告,不会报错)(默认)

                @optional:

                                 这个方法不一定要实现(不要求实现,怎样写都不会有警告)。

 

         基协议

                 NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它;

                  NSObject也是一个基协议,最根本最基本的协议;

                  NSObject协议中声明很多最基本的方法,比如description、retain、release等;

                  建议每个新的协议都要遵守NSObject协议。

               

                  在定义变量是需要指定基协议:

// NSObject类型的对象,并且要遵守NSCopying协议
NSObject<NSCopying> *obj;
// 任何OC对象,并且要遵守NSCoding协议
id<NSCoding> obj2;

             @property声明的属性也可用做一个遵守协议的限制:

@property  (nonatomic,  strong)  类名<协议名称>  *属性名;
@property  (nonatomic,  strong)  id<协议名称>  属性名;

             协议可以定义在单独.h文件中,也可定义在某个类中:

                        --> 如果这个协议只用在某个类中,应该把这个协议定义在该类中

                         --> 如果这个协议用在很多类中,就应该把定义在单独.h文件中

      

                 分类可以定义在单独.h和.m文件中,也可定义在某个类中:

                        --> 一般情况下,都是定义在单独.h和.m文件中

                         --> 定义在原来类中的分类,只要求能看懂语法

 

                 @protocol和@class:

                         --> 在.h声明文件中,用@protocol遵守某个协议,用@class包含某个对象

                         --> 在.m实现文件中,用#import真正包含协议对象的声明

 

 

         代理设计模式

    

                  设计原理:

                         有些麻烦的方法不想当前对象调用,就可以找个其他对象帮忙调用实现,即交给代理对象去做

 

                 设计原则:

                        --> 首先得拥有某个代理对象属性

                         --> 其次要很清楚代理有哪些方法列表

                         --> 最后要保证能解耦

 

                 实现方案:

                        --> 定义一个protocol,在其中声明一些和代理沟通的方法

                         --> 拥有一个代理属性id<protocol>  delegate

                         --> 让代理遵守protocol

 

 


  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值