ios黑马程序员--ARC

来源:互联网 发布:网络间接调研主要方法 编辑:程序博客网 时间:2024/05/07 02:08
强指针:默认情况下所有的指针都


是强指针型(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,任意类


都可以遵循这个协议,























































0 0