IOS学习---OC基础学习(ARC 协议)

ARC机制:
不需要再dealloc中手动添加release操作
原理:
只要没有强指针指向对象,就会释放对象


指针分两种:
1、强指针:默认情况下,所有的指针都是强指针__strong(两个下划


线)
2、弱指针: __weak Person *p = [[Person alloc] init];
该对象P创建后 立即被释放 因此这种写法没有价值和意义


@property (nonatomic strong) Dog *dog;
//使用ARC之后不用写retain 改为strong 基本类型还是assign


ARC特点:
1、不允许调用release、retain、retainCount
2、允许重写dealloc 但是不允许调用[super dealloc]
3、@property 的参数
   *strong:成员变量为强指针相当于原来的retain(适用于OC对象


类型)
   *weak:成员变量时弱指针 相当于原来的assign(适用于OC对象


类型)
   *assign:适用于非OC对象类型


项目中多个文件 有的兼容ARC有的不兼容ARC 可能由于有些不支持


ARC 可以讲项目中的某个文件改为ARC
方法:在build setting 中搜索automatic 双击 ARC的选项 在弹出


的的的对话框中添加下面代码:
-fno-bobjc-arc
既可以将ARC转为非ARC


ARC的循环引用(人和身份证):
问题:双方互相引用 互不释放
未引入ARC的解决方法
.h文件中利用@class引用  .m文件中在import 类.h
将对象中一个保持retain 一个改为assign


使用ARC的解决方法:
.h文件中利用@class引用  .m文件中在import 类.h
将对象中一个保持strong 一个改为weak
1、一端用strong 一端用weak




Block类型:
作用:用来保存一端代码
block的标志是:^
block跟函数很像
1、可以保存代码
2、有返回值
3、有形参
4、调用方式相同
block方法:
void (^myblock)(形参) = ^{//如果没有形参可以省略()
NSLog(@"----------------");
};//有分号
//利用block变量调用block内部的代码
调用block方法
myblock();


有形参的block:
计算两个数的和
声明
int (^sumblock)(int,int)
实现
^(int a,int b){
return a+b;
};
声明实现一起来:
int (^sumblock)(int,int) = ^(int a,int b){return a+b};
调用:
int c = sumblock(10,11);
此处参考指向函数的指针(C语言)二者有相似之处 
int sum(int a,int b)
{
return a+b;
}


int (*p)(int ,int ) = sum;
调用:int c = p(10,11);


block总结“
1、如何定义block变量
int (^sumblock)(int,int) 
void (^myBlock)();
2、如何利用block封装代码
^(int a,int b){
return a-b;
};
^(){
NSLog(@"---------");
};
^{
NSLog(@"----------");
};


3、block访问外部变量
1、block内部可以直接访问外部变量
2、默认情况下,block不可以修改外部变量
3、局部变量加上__block(两个下划线)关键字,这个局部变量就可以


在block中进行修改


4、利用typedef定义block类型
typedef int (^MyBlock)(int,int);
//以后就可以利用MyBlock这种类型来定义block
MyBlock block;
MyBlock b1,b2;


b1 = ^(int a,int b){
returna - b;
};


MyBlock b3 = ^(int a,int b){
return a-b;
};




@protocol(协议)的使用:
用途:
1、可以声明方法(不能声明成员变量)
2、只要某个类遵守这个协议,就相当于拥有这个协议中的所有方法


声明(在.h文件中#import “协议名称”)
3、只要父类遵守了某个协议,就相当于子类也遵守了


格式:
协议的编写
@protocol 协议名称
//方法声明列表
@end


某各类遵守协议
@interface 类名 :父类<协议名称,协议名称>
@end;


@protocol中的方法也可以选择性的实现
例如:
@protocol MyProtocol


//@required要求实现,不实现就会发出警告 默认为required
//@optional 不要求实现(可以不实现)


- (void)test4;
@required
- (void)test;
- (void)test2
@optional
- (void)test3;


@end;


@required、optional 主要用于程序员之间的交流


协议遵守协议:
1、一个协议可以遵守其他多个协议,多个协议之间用逗号隔开
2、一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声


明
@protocol 协议名称 <协议1,协议2>
@end;


基协议:
NSObjce是一个基类,最根本最基本的类,任何其他类最终都要继承


他
其实还有一个协议,名字也叫NSObject,他是一个基协议,最根本最


基本的协议
NSObjcet协议中声明分舵最基本的方法比如description、retain、


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


协议的总结:
1、协议的定义
@protocol 协议名称 <NSObjcet>
//方法声明列表
@end;


2、如何遵守协议
  ①类遵守协议
    @interface 类名 : 父类名<协议名称1,协议名称2>
    @end;
  ②协议遵守协议
    @protocol 协议名称 <其他协议名称1,其他协议名称2>
    @end;


3、协议中方法声明的关键字
   @required:默认的 要求实现  如果不实现会发出警告但不报错
   @optional:不要求实现  不会出现警告


4、定义一个变量的时候 限制遵守某个协议
   类名<协议名称> *变量名;
   id<协议名称> 变量名;
例如:
   NSObjcet <MyProtocal> *obj;
   id<MyProtocol> obj2;没有*号


如果没有遵守对应的协议,编译器会发出警告


5、@property中声明的属性也可以用做一个遵守协议的限制
@property (nonatomic,strong) 类名<协议名称>*属性名;
@property (nonatomic,strong) id<协议名称> 属性名;


@property (nonatomic,strong) Dog<MyProtocol>*dog;
@property (nonatomic,strong) id<MyProtocol> dog2;


6、协议可以单独定义在其他文件中(.h),也可以单独定义某个类


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


2、如果这个协议用在很多类中,应该把协议定义在单独文件中


7、分类可以定义在单独.h和.m文件中,也可以定义在原来的类中
1、一般情况下,都是定义在单独文件中
2、定义在原来类中的分类 只要求能看懂语法





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章