一、ARC

ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
ARC规则:只要还有一个强指针变量指向对象,对象就会保持在内存中
弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误
使用注意:
1、不允许调用release、retain、retainCount;
2、允许重写dello方法,但是重写dello方法中不允许[super delloc];
3、@property参数:
strong :代表创建的 _成员变量 是一个强指针,类似于原来的retain,(适用于OC对象)
weak   :代表创建的 _成员变量 是一个若指针,类似于原来的assgin,(适用于OC对象)
assign :这个适用于非OC对象,比如 int型、long型等等
4、以前的retain要改为strong
5、假如出现循环引用的用法,那么就要一端用strong一端用weak
例如:一条狗有一个主人,一个主人有一条狗!

  1. <p>
  2. @interface Dog : NSObject
  3. @property (nonatomic,weak) Person *person; // 狗拥有一个主人对象,这个指针是一个弱指针,
  4. @end</p><p>@interface Person : NSObject
  5. @property (nonatomic,strong) Dog *dog;    // 人拥有一个狗对象,这个指针是一个强指针,
  6. @end</p><p>@implementation Person
  7. @end</p><p>@impleme</p>

复制代码

二、block

block和函数很像,就是保存代码的一种方式:
1、可以保存代码;
2、有返回值;
3、有形参;
4、调用方式一样

  1. <p><p>//不带形参的block,如果没有形参可以省略后面的小括号
  2. void (^myblock)() = ^{
  3. NSLog(@“我的BLOCK”);
  4. };</p><p>//带形参的block
  5. //带两个形参的block求两个int型数据的和
  6. int (^heblock)(int,int) = ^(int a, int b){
  7. return a + b;
  8. };</p><p>//用一个block输出n条横线
  9. void (^shuchu)(int) = ^(int n){
  10. for(int i= 0;i<n;i++)
  11. NSLog(@“———————”);
  12. };</p>

利用typedef定义block类型

  1. <p><p>typedef int (^myblock)(int, int);</p><p>myblcok he = ^(int a, int b){
  2. return a + b;
  3. };</p><p>int c = he(19,9); // 将19和9的和赋值给c;</p>

总结:
1>如何定义block
int (^heblock)(int,int);
void (^myblock)();
2>如何通过block封装代码
^{NSLog(@“我的BLOCK”);};
3>block访问外面的变量
*block内部可以访问外面的变量
*默认情况下block不能修改外面的局部变量
*给局部变量加上_block关键字,这个局部变量就可以在block内部修改
如: int a = 11;
    _block int b = 12;
上面的两个变量a和b只有b能够在block中被修改!

4、利用typedef定义block变量
typedef int (^myblock)(int, int);
上面定义一个block变量后,以后就可以利用my block来直接定义block变量了
如:

  1. <p>
  2. myblock a,b;
  3. myblock c;</p><p>b = ^(int a, int b){
  4. return a * b;
  5. };// 注意这个大括号背后的分号不能!因为这是类似一个赋值运算!</p><p>myblock d = ^(int a, int b){
  6. return a * b;
  7. };</p>

三、协议
协议 @protocol 用来声明一堆方法(不能声明成员变量)
协议就是用来声明方法的,只要某个类遵守这个协议,就拥有了这个协议中方法的声明!
注意:只要父类遵守了某个协议,那么子类也拥有了某个协议
:  继承父类
<> 遵守协议
协议的参数:

  1. <p>
  2. @required // 必须实现,不实现就会报错</p><p>@optional // 不要求必须实现,不实现不会有警告</p><p>@protocol MyPortocol <NSObject>// 所有的协议都要遵守基协议
  3. - (void)test1;</p><p>@required
  4. - (void)test2;
  5. - (void)test3;</p><p>@optional
  6. - (void)test4;
  7. - (void)test5;</p><p>@end
  8. // @required @optional关键字多数是用于程序员之间的交流,
  9. // 还有就是用于代理模式
  10. // 一个类可以遵守多个类</p><p>@interface 类名 : 父类 <协议1,协议2> // 这个类就拥有了这两个协议所有的方法</p>
  1. //基协议:任何协议都遵守的一个协议 NSObject
  2. //基协议就类似类的定义中的父类,简单的说就是协议也可以遵守某个协议
  3. // 如果一个协议遵守了某个协议,那么这个协议就拥有了遵守协议的所有方法声明。
  4. @protocol MyProtocol1 <MyProtocol>
  5. - (void)test;
  6. @end

上面的例子中MyProtocol1就拥有了 MyProtocol协议中所有的方法声明
限制对象类型:

  1. <p>
  2. // 限制某一个指针变量只能保存遵守某种协议的对象;</p><p>Dog<MyProtocol> *dog; // 这个dog只能保存继承Dog类且遵守了MyProtocol协议的对象</p><p>
  3. @interface Dog : NSObject <MyProtocol></p><p>@property (nonatomic, strong) id<MyProtocol2> mm; // 创建一个对象成员变量,只能保遵MyProtocol2协议的对象
  4. @end</p>

协议的提前声明

  1. <p><p>@protocol XXXXX; //声明XXXX是一个协议,但是如果要用到这个协议内的声明的方法,那么就必须要#import”XXXXX.H”</p><p>// 以后在.h文件中都要用@class/@protocol来声明是个类/协议!
  2. //因为这样子的效率比较高,当要用到这个类的具体内容/协议的具体声明的时候才#import“”/< ></p>

小结:牢牢记住下面的用法
1、协议的定义
@protocol 协议名称<NSObject>
// 方法的声明
@end
2、如何遵守协议
1>类遵守协议
@interface 类名 : 父类名<协议1,协议2>
@end
2>协议遵守协议
@protocol 协议名称<协议1,协议2>
@end
3、协议中方法的声明关键字
1>@required(默认)
   要求实现,如果没有实现就会发出警告
2>@optional
   不要求必须实现,不实现不会有警告
4、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
Dog<MyProtocol> *dog;
id<协议名称> 变量名;
id<MyProtocol> dog;
如果没有遵守对应的协议,编译器会报出警告
5、@property中声明的属性也可以用一个遵守某个协议来限制
@property <nomotomic,strong> Dog<MyProtocol> *dog;
@property <nomotomic,strong> id <MyProtocol> dog;
注意!!假如编译器的警告给某句代码加了一根横线,那么这个警告就是必须要修复的严重警告
6、协议可以定义在其他文件也可以定在某个类中 
//当某个协议只需要某个类遵守的时候就可以和这个类的声明写在同一个文件中;
//当某个协议只需要多个类遵守的时候就要将协议单独写在一个文件中
7、分类也可以定义在单独的.h和.m文件中,也可以定义在原来的类中
//注意!!一般情况下都是定义在单独的文件中!定义在原来类中只要求看懂就行了!
//因为假如定义在原来的类的文件中,何必建分类勒!是不?

代理设计模式(协议的应用)
定义一个类拥有某个成员变量(是对象)的时候,限制这个对象必须要遵守特定的某个协议,那么我这个类写好以后就根本不用动了。我只接受遵守这个协议的成员变量,这样子我方法实现里面就按照这个协议中我所需要的方法直接调用就行了,不用关心以后这个成员变量会变成谁!
例如:
//创建一个协议,协议里面有查询票价和票数量的两个方法
// Dailixieyi.h文件

  1. <p>
  2. #import <Foundation/Foundation.h>
  3. @protocol Dailixieyi<NSObject>
  4. - (int)piaoShu;</p><p>- (int)piaoJia;
  5. @end</p>
  1. <p>// Daili1.h文件
  2. #import <Foundation/Foundation.h>
  3. #import “Dailixieyi.h”</p><p>@interface Daili1 : NSObject <Dailixieyi></p><p>@end</p
  1. <p>// Daili1.m文件
  2. #import <Foundation/Foundation.h>
  3. #import “Daili1.h”</p><p>@implementation Daili1
  4. - (int)piaoShu
  5. {
  6. return 15;// 假设返回还有15张票
  7. }</p><p>- (int)piaoJia
  8. {
  9. return 150;// 假设返回的票价是50元
  10. }
  11. @end</p>

————————————————————————————————————————————————————————————

  1. <p>//GuKe.h文件
  2. #import <Foundation/Foundation.h>
  3. #import “Dailixieyi.h”
  4. //注意!这里你只是拥有了这个协议,但是你想使用某个类的时候还得#import这个类的声明!
  5. //这种设计模式只关心我需要某个类的时候假如这个类的声明就可以了
  6. @interface GuKe : NSObject</p><p>@property (nonatomic,strong) id<Dailixieyi> daili;// id类型不管什么对象我都能接收但是必须要符合Dailixieyi这个协议!!
  7. - (void)maiPiao;
  8. @end</p>

iOS开发——OC基础-ARC、BLOCK、协议的更多相关文章

  1. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  2. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  3. OC基础 代理和协议

    OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...

  4. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  5. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  6. iOS开发——OC篇&OC高级语法

    iOS开发高级语法之分类,拓展,协议,代码块详解 一:分类 什么是分类Category? 分类就是类的补充和扩展部分 补充和扩展的每个部分就是分类 分类本质上是类的一部分 分类的定义 分类也是以代码的 ...

  7. iOS开发——OC篇&常用关键字的使用与区别

    copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用与区别 最近在学习iOS的 ...

  8. iOS开发-OC语言 (一)oc数据类型

    分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...

  9. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

随机推荐

  1. php 数据访问(以mysql数据库为例)

    //建一个连接,造一个连接对象$db = new MySQLi("localhost","root","123","mydb&qu ...

  2. PHP中静态与抽象的概念

    静态//普通成员//普通成员是属于对象的 //静态成员//静态成员属于类的 类中的静态属性非常类似于函数的全局变量.类中的静态成员是不需要对象而使用类名来直接访问的. //关键字:static//se ...

  3. 理解Linux系统/etc/init.d目录和/etc/rc.local脚本

       一.关于/etc/init.d 如果你使用过Linux系统,那么你一定听说过init.d目录.这个目录到底是干嘛的呢?它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,因此它非常重 ...

  4. Java http方式提交短信到短信网关

    URL url = new URL("短信网关url"); 一般短信内容需要用URLEncoder.encode()编码一下 HttpURLConnection httpCon = ...

  5. MySQL外键使用需要注意的几点

    最近刚刚接触MySQL,在建立表示遇到了一些问题,总是提示错误代码:150 can't create table ...,所以就到网上搜索了一下发现还有以下几点需要注意的: [CONSTRAINT [ ...

  6. $.ajax()引发的对Deferred的总结 (转)

    传统的ajax写法: $.ajax({ url:"1.json", type:"get", success:function(data){}, error:fu ...

  7. JavaScript数据操作--原始值和引用值的操作本质

    我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...

  8. 常用JS效果 不断进步贴 不停更新~ 纪念用~

    常用效果 JS  都是Jquery  没有特殊说明 1.选项卡  用的JQuery  以后学好点再来对比 看下 /* * @parent 最外层父级元素 * @EventElement 触发事件元素 ...

  9. Linux中服务器软件为什么需要编译安装

    为什么服务器软件需要编译安装?一个流传很广的说法是编译安装性能更好,其实这是个谣言. 服务器CPU事实已经被Intel垄断了,就那么几种型号,编来编去生成的机器码是一样的.Intel宣传自己的编译工具 ...

  10. TTFB-首字节时间简介

    百度站长工具里看到有一个"首字节时间"的建议,第一次听说,还真不知道是什么东东.百度站长工具里面的解释是:"浏览器开始收到服务器响应数据的时间=后台处理时间+重定向时间, ...