ios黑马程序员--ARC

强指针:默认情况下所有的指针都


是强指针型(strong) 在Arc当中


,一个对象只要没有强指针引用,


那么它就会被系统回收

弱指针:弱指针不影响对象的回收

在Arc当中,所有的跟手动管理内存


相关的方法都不能调用比如说


dealloc不能重写父类 了(不能


super dealloc)

//__weak定义一个弱指针

__weak Person * p2 = p//弱指针


不影响对象

//强指针引用使用OC对象类型,


@property (nonatomic,strong)

我们用别人的项目有可能用的是非


arc的项目

-fno-objc-arc

-f-objc-arc

第三方框架:就是别人写的项目,


我们要用,如果他是非arc机制,给


编译器加一个参数-fno-objc-arc就


是告诉编译器这个文件就是非Arc机


制的,这样就不会报错了,并且非


arc手动内存管理的方法都能够正常


调用 了,在非arc项目中引入 arc机


制的文件,给编译器加一个参数 -


f-bojc-arc,就是告诉编译器这个文


件是arc机制的


edit->refactor-convert to 


arc循环引用问题

arc机制中如果出现了循环引用问题


, 只需要把其中引用一方变成,


weak弱指针既可解决问题

block类型

int bool char float double 


NSObject * id sel

他们的共同特点就是能够定义成变


1.int a = 0;

BOOL b = YES;

2.当做函数,和方法的参数的传递

(void) test(int) a


block:是oc中比较特殊的数据类型


,它用来封装一段代码,并且可以


把这段代码当做参数传递

1.通过{}来封装代码

1.void test():返回值为空,并且没


有参数{}

^{};

2.int test();有返回值,还有一个参


^{return 10;}

3.int test(int a);有返回值,还有一


个参数

^(int a){return a + 1}

4.int test(int a,int b)有返回值,有


多个参数


1.定义一个返回值为空,并且没有


参数的block变量

void (^myblock)() = ^{};

2.定义一个有返回值的,并且没有


参数的block变量

int (^myblock)() = ^{return 


10;};

3.定义一个有返回值,并且有一个


参数的block变量

int (^myblock)(int a) = ^(int 


a){return a + 1};

4.定义一个有返回值,并且有多个


参数的block变量

int (^myblock) (int a,int b) = 


^(int a,int b){return a + b}

block好处就是,我定义block的人


本身可以不关心

//block内部算法的实现

//谁调用有block参数的方法,谁就


给我实现block内部算法

协议

协议就是用来声明方法

@protocol Myprotocol


- (void)test;


@end

在.m中实现协议中的方法

@required表示以下方法必须实现

- (void) test1;

@optional 表示可选实现

- (void)test2;

可选的就不会在遵守协议的那个类


里面显示

但是,required就会提示你必须实


协议本身他可以遵循其他的协议

协议可以遵循多个

基协议

协议就是用来声明方法的

@protocol Myprotocol 


<NSObject>

内部声明方法

@end

协议内方法的约束

@required必须实现的方法

@optional 选择实现

默认的方法就是 必须实现的

让某个类遵循协议只需要在类继承


后面 <协议名字>

类可以遵循多个协议<协议名,协议


名,协议名>

协议本身也可以遵循其他协议<协议


名字>

协议当中不可以声明成员变量

子类继承了父类,同样也会继承父


类遵循的协议

NSObject * obj = [[NSObject]


init];

id obj2= [[NSObject alloc] init];

//定义OC对象变量时,可以给他加


一个协议约束

Person<Myprotocol> *p  = 


[[Person alloc] init];

@property (nonatomic,strong)


Car<Myprotocol2> * car;

//如果你要限定某个对象,一定要实


现某个协议,那么我们一般用


id<Myprotocol2>obj 去定义

@property (nonatomic,strong)id 


<Myprotocol2> obj;

//与@class功能一样,就是告诉类


,MyProtocol是一个协议

@protocol MyProtocol;


把协议声明到 一个类的.h文件中,


其他类继承之外,没办法去遵循这


个协议了

单独把协议定义成一个.h,任意类


都可以遵循这个协议,





























本文出自 “言十年” 博客,请务必保留此出处http://yanshinian.blog.51cto.com/8275527/1564567

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。