OC-ARC机制、数据类型block、 protocol协议、Foudation框架

一、ARC机制(编译器特性)
1、简介
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐
,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。不再需要担心内存管理,因为编译器为你处理了一切
2、ARC的判断准则:只要没有强指针指向对象,就会释放对象
 1.指针分2种:
   1>.强指针:默认情况下,所有的指针都是强指针_strong
   2>.弱指针:_weak
 2.允许重写dealloc,但是不允许调用[super dealloc] 
 3.@property的参数
strong :成员变量是强指针(适用于OC对象类型)
weak :成员变量是弱指针(适用于OC对象类型)
assign : 适用于非OC对象类型 
 4. 以前的retain改为用strong,其他一切不变

#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@end
#import "Person.h"
@implementation Person
- (void)dealloc{
NSLog(@"Person is dealloc");// [super dealloc];//使用ARC机制后不需要再带
}
@end
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
- (void)dealloc{
NSLog(@"Dog is dealloc");
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(){
Dog *d = [[Dog alloc] init];
Person *p = [[Person alloc] init];
p.dog = d;
d = nil;
NSLog(@"%@", p.dog);
return 0;
}
void test(){
__weak Person *p = [[Person alloc] init];// 错误写法(没有意义的写法)
NSLog(@"%@", p);
NSLog(@"------------");
}

3、Xcode的ARC转换功能
 1>.如果现有项目不是ARC类型项目,可以转换成ARC项目

Edit->Refactor->Convert to Objective-C ARC->check->next->生成预览save->Enable
 2>.怎么查看现有项目是不是ARC项目
选中项目->Build Settings->放大镜里面搜Auto->找到正在用的编
译器,看是否是ARC
 3>.想让项目中既有ARC又有非ARC
如果现在是ARC则:选中项目->Build Phases->Compile Sources->
选中被编译文件,双击或者回车,弹出框里输入-fno-objc-arc(不需要OC的ARC),回车,这时就可以编辑非ARC代码了如果现在不是ARC:上面步骤里输入-f-objc-arc就行
4、ARC里面的循环引用
当两端循环引用的时候,解决方案:
 1>.ARC:一端用strong,一端用weak
 2>.非ARC:一端用retain一端用assign

二、数据类型block
1、作用:封装了一段代码,可以再任何时候执行,Block可以作为函
数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
2、定义

void (^myBlock)()=^{
NSLog(@"----------");//定义了一个打印两条虚线的block代码块
NSLog(@"----------");
};
int (^sumblock)(int, int) = ^(int a, int b) {
return a+b;//定义了一个求和的block代码块
};

//如果block没有形参可以省略(int n)

void(^lineBlock)(int)=^(int n){
for(i=0;i<n;i++){
NSLog(@"------");//定义了一个输出n调虚线的block代码块
}
};
int sum(int a,int b){//指向函数的指针
return a+b;
}
3、调用
myBlock();//block调用
int c = sumblock(10,11);//block调用
lineBlock(5);//block调用
int (*p)(int, int) = sum;//指向函数的指针调用
4、用typedef定义block类型
typedef int (^MyBlock)(int,int);
5、需要掌握
 1>.如何定义block变量
int (^MyBlock)(int,int);
 2>.如何利用block封装代码
^(int a, int b) {
return a + b;
};
 3>.block内部可以访问外部变量,默认情况下block不能修改外部变 量,给局部变量加上_block关键字,这个局部变量就可以再block内 部修改
 4>.利用typedef定义block类型

三、protocol协议
1、基本用途
 1>.可以用来声明一大堆方法(不能声明成员变量)
 2>.只要某个类遵守了这个协议,就相当于拥有这个协议中的所有
方法声明
 3>.只要父类遵守了某个协议,就相当于子类也遵守了
2、protocol协议
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>// 定义了一个名叫MyProtocol的协议
- (void)test;
@required// @required 要求实现,不实现就会发出警告
- (void)test1;
- (void)test2;
@optional // @optional 不要求实现
- (void)test3;
@end
: 继承父类
<> 遵守协议
#import <Foundation/Foundation.h>
@interface Person : NSObject <MyProtocol>//遵守了MyProtocol协议
@end
3、一个类可以遵守多个协议,一份协议遵守了另一份协议,就拥有 了另一份协议所有声明的方法
@protocol 协议名称 <协议1, 协议2>
@end
4、基协议
 1>.NSObject是一个基类,最根本最基本的类,任何其他类最终都 要继承它
 2>.其实还有一个协议,名字也叫NSObject,它是一个基协议,最
根本最基本的协议
 3>.NSObject协议中声明很多最基本的方法,比如description、
retain、release等
 4>.每个新的协议都要遵守NSObject协议
5、限制对象类型
强制要求obj保存的对象必须遵守MyProtocol协议
NSObject<MyProtocol> *obj = [[Person alloc] init];
id<MyProtocol> obj = [[Person alloc] init];
四、Foudation框架
1、常用的几种结构体,使用这几种函数的前提是添加CoreGraphics 框架
 1>.NSRange(location length)表示范围的结构体
例:表示NSString *str = @"i love oc";中love的范围
NSRange r1 = {2,4};//不用
NSRange r2 = {.location=2, .length=4};//不用
NSRange r3 = NSMakeRange(2,4);//掌握
NSRange range = [str rangeOfString:@"ve o"];//查找某个字符串在str中的范围,如果找不到,length=0,location=NSNotFound=-1
NSLog(@"loc = %ld, length = %ld",range.location,range.length);
 2>.NSPoint\CGPiont(CGFloat x,CGFloat y)表示一个 点//CGFloat就是double类型
CGPiont p1 = NSMakePoint(10,10);
NSPiont p2 = CGPiontMake(10,20);//最常用
 3>.NSSize\CGSize(CGFloat width,CGFloat height)表示尺寸
NSSize s1 = CGSizeMake(100,50);
NSSize s2 = NSMakeSize(100,50);
CGSize s3 = NSMakeSize(100,50);
 4>.NSRect\CGRect(CGFloat x,CGFloat y,CGFloat  width,CGFloat height)表示位置和尺寸
NSRect r1 = CGRectMake(0,0,100,50);
NSRect r2 = NSMakeRect(0,0,100,50);
CGRect r3 = NSMakeRect(0,0,100,50);
 5>.将结构体转为字符串,便于输出
NSString *str = NSStringFromPoint(p1);
NSString *str = NSStringFromSize(s1);
NSString *str = NSStringFromRect(r1);
 6>.CGPointZero == CGPointMake(0,0);//表示原点
 7>.BOOL b = CGPointEqualToPoint(CGPointMake (10,10),CGPointMake(10,10));//比较两点是否相同
 8>.坐标原点在左上角,x值往右增加,y值往下增加,宽带表示x值
方向,高度表示y值方向
2、常用的集合
 1>.NSString:不可变字符串

字符串的创建

NSString *s1 = @"jack";
NSString *s2 = [[NSString alloc] initWithString:@"jack"];
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d",10];
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];//C字符串->OC字符串
const char *cs = [s4 UTF8String];OC字符串->C字符串
NSString *s5 = [NSString alloc] initWithContentsOfFile:@"绝对路径"//文件路径 encoding:NSUTF8StringEncoding error:nil;//NSUTF8StringEncoding 用到中文就可以用这组编码
NSString *s6 = [NSString alloc] initWithContentsOfURL:@"绝对路径"//文件路径 encoding:NSUTF8StringEncoding 
error:nil;
URL:资源路径
协议头:// 路径;file:// 本地文件;ftp:// 服务器文件
2>.NSMutableString:可变字符串
NSMutableString字符串的创建跟NSString一样,可以改变里面的内容,例:
NSMutableString *s7= [NSMutableString 
stringWithFormat:@"age is ];
[s7 appendString:@"11 12"];//在后面拼接字符串
NSRange range = [s7 rangeOfString:@"is"];//获取is的范围
[s7 deleteCharactersInRange:range];//删除is
3>.NSArray//不可变OC数组,有序
OC数组只能存放OC对象,不能存放非OC对象类型,比如int struct  enum
Person *p[5] = {[[Person alloc] init]};
NSArray *array = [NSArray array];//这个数组永远是空数组
NSArray *array = [NSArray arrayWithObject:@"jack"];
NSArray *array = [NSArray 
arrayWithObjects:@"jack",@"rose",nil];//nil是数组元素结束标记
还可以这样写NSArray *array = @[@"jack",@"rose"];//快速创建 一个Array数组
[array count];array.count//count访问数组元素的个数
[array objectAtIndex:2]//array[2]访问数组第三个元素
遍历数组元素
for(int i=0;i<array.count;i++){
NSLog(@"%@",array[i]);
}
或者
for(id obj in array){//每次把array数组中的元素传给obj执行循环体
NSUInteger i = [array indexOfObject:obj];//找出obj元素在数组中的位置
NSLog(@"%ld - %@",i,obj);//id obj代表数组中的每一个元素
if(i=0){break;}//退出循环
}
[array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
NSLog(@"%ld - %@",idx,obj);
if(idx==1){//停止遍历
*stop = YES;
}
}];//没遍历一个元素就会调用一次block,并且当前元素和索引位置当做参数传给block
4、NSMutableArray不可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose",@"jim",nil];
[array addObject:[[Person alloc] init]];//添加元素
[array addObject:@"jack"];//添加元素
[array removeAllObject];//删除所有元素
[array removeObject:@"jack"];//删除指定元素
[array removeObjectAtIndex:0];//删除指定下标元素
注:@[]只能创建不可变数组NSArray
5、NSSet//不可变,无序
NSSet *s = [NSSet set];//创建一个空set
NSSet *s = [NSSet setWithObjects:@"jack",@"rose",nil];
NSString *str = [s anyObject];//随即取出一个元素
6、NSMutableSet//可变
NSMutableSet *s = [NSMutableSet set];
[s addObject:@"jack"];//添加元素
[s removeObject];//删除元素
7、NSDictionary不可变字典//无序
索引-->内容即key->value
NSDictionary *dict = [NSDictionary dictionaryWithObject:
@"jack", forKey:@"name"];
id obj = [dict objectForKey:@"name"];
NSLog(@"%@",obj);
NSArray *keys = [dict allKeys];
for(int i=0;i<dict.count;i++){
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@ = %@",key,object);
}
[dict enumrateKeyAndObjectsUsingBlock:^(id key,id obj,BOOL *stop){
NSLog(@"%@ = %@",key,obj);
}];
8、NSMutableDictionary可变字典//无序
NSMutableDictionary *dict = [NSMutableDictionary dictionary];//创建一个可变字典
[dict setObject:@"jack" forKey:@"name"];//添加键值对
[dict removeObjectForKey:@"name"];//移除键值对
总结
集合  
 1.NSArray\NSMutableArray  
 * 有序  
 * 快速创建(不可变):@[obj1, obj2, obj3]
 * 快速访问元素:数组名[i]  
 2.NSSet\NSMutableSet  
 * 无序
 3.NSDictionary\NSMutableDictionary  
 * 无序
 * 快速创建(不可变):@{key1 : value1,  key2 : value2}  
 * 快速访问元素:字典名[key]
9、NSNumber
NSNumber *num = [NSNumber numberWithInt:10];
NSDictionary *dict = @{
@"name" : @"jack",
@"age" : num
};
NSNumber *num2 = dict[@"age"];
int a = [num2 intValue];
NSLog(@"%d" , a);
NSString *str = [NSString stringWithFormat:@"%d", a];
NSLog(@"%d", [str intValue]);
 1>.@20  将 20包装成一个NSNumber对像
NSArray *array = @[
@{@"name" : @"jack", @"age" : @20}];
 2>.将各种基本数据类型包装成NSNumber对象
@10.5;
@YES;
@'A'; // NSNumber对象 
@"A"; // NSString对象 

 3>.将age变量包装成NSNumber对象
int age = 100;@(age);//[NSNumber numberWithInt:age];
10、NSValue
 1>. 结构体--->OC对象
CGPoint p = CGPointMake(10, 10);
 2>.将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
 3>.将value转为对应的结构体
[value pointValue];
NSArray *array = @[value ];
11、NSDate日期格式化
NSDate *date = [NSDate date];//创建一个时间对象
NSLog(@"%@", date); //打印出的时候是0时区的时间(北京-东8区)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 日期格式化类
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//y 年  M 月  d 日  m 分 s 秒  H (24)时  h(12)时
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@", str);
NSString *time = @"2011/09/10 18:56";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date);





  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值