OC--Foundation框架
OC--Foundation框架
一些其他知识总结
Block 注意:大括号后面一定有分号 ;
形式:^( 形参 ) { 内容代码 };当没有形参是可以^{ 内容代码 };
格式:返回类型 (^Block名称) (形参) = ^( 形参 ){ 内容代码 };
返回类型 ( ^Block名称) (形参) ; // 返回类型可以是void
Block名称 = ^( 形参 ) { 内容代码 };
例如:// 计算两个整数的和
#import <Foundation/Foundation>
Int main()
{
// int (^BlockSum)( int,int )= ^(int a,int b){ return a + b; };
int (^BlockSum)( int,int ) ;
BlockSum = ^(int a,int b){return a + b;};
int c = BlockSum( 8, 7);
NSLog( @ “%d”, c );
}
用typedef简化Block // 计算两个整数的和
typedef返回类型 ( ^新名称) (形参) ;
新名称 变量名 = ^(形参){ 内容 };
typedef int ( ^MyBlock ) ( int , int );
MyBlock sumBlock = ^(int a, int b){
return a + b;};
int c = sumBlock( 5, 8 ); // 调用<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
@protocol @end 协议:用来声明方法
1. 基本用途
* 可以用来声明一大堆方法(不能声明成员变量)
* 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
* 只要父类遵守了某个协议,就相当于子类也遵守了
2. 格式
* 协议的编写
@protocol 协议名称
// 方法声明列表
@end
* 某个类遵守协议
@interface 类名 : 父类 <协议名称>
@end
3. 关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
* @required:这个方法必须要实现(若不实现,编译器会发出警告)
* @optional:这个方法不一定要实现
4. 协议遵守协议
* 一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开
* 一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
@protocol 协议名称 <协议1,协议2>
@end
5. 基协议
* NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
* 其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
* NSObject协议中声明很多最基本的方法,比如description、retain、release等
* 建议每个新的协议都要遵守NSObject协议
当我们只是引用某个类或协议时,只需要@class@protocol
当我们需要使用某个类或协议时,必须#importxx.h
1.协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end
2.如何遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
3.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *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> 定义在原来类中的分类,只要求能看懂语法
*/
协议代理
双方通过协议建立关系,其他的类,只要遵守协议都可以成为代理
例如人去买票,可以找一个人(受雇者)去帮买,只要某个类通过协议,都可以是收雇者
所以我们必须在Person类中,写好协议代理
@interface Person : NSObject
- (void) buyTicket;
// 拥有一个代理属性
// id代表代理的类名随便
// 但必须遵守TicketDelegate协议
@property (nonatomic, retain)id<TicketDelegate> delegate;
@end
只要某个代理遵守了某个协议,并实现了该协议的方法,都可以成为代理
Agent.m文件
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@interface Agent : NSObject<TicketDelegate>
@endAgent.m文件
#import "Agent.h"
@implementation Agent
// 剩余的票数
- (int)leftTicketsNumber
{// ... 亲自跑电影院\或者打电话return 1;
}// 每一张票多少钱
- (double)ticketPrice
{// ... 亲自跑电影院\或者打电话return 1000;
}
@end
Main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "NextAgent.h"int main(int argc, const char * argv[])
{@autoreleasepool {Person *p = [[[Person alloc] init] autorelease];NextAgent *a = [[[NextAgent alloc] init] autorelease];p.delegate = a;[p buyTicket];}return 0;
}
这样Person类不用改,只要其他类遵守协议即可
Foundation框架
函数 CG开头的函数要导入框架:CoreGraphics
NSRange
NSPoint\CGPoint
NSSize\CGSize
NSRect\CGRect
1、 NSRange 参数:lacation length
*rangeOfString:@”字符”
* 求响应字符在字符串中的起始位置和长度
* 如果找不到,length= 0, location = NSNotFound = -1
代码示例
int main()
{
NNString *str = @” i love heima”;
//通过调用rangeOfString查找字符串”love”在str中的位置和长度
NSRange range = [ str rangeOfString:@”love” ];
//如果能找到字符串”love”,则返回” love”在str中的位置和长度
//如果找不到字符串”love”,则返回length = 0,location = -1;
NSLog(@”loc = %d, length = %d”,range.location, range.length);
}
2、NSPoint\CGPoint // 定义一个点的坐标
NSPoint p1 =NSMakePoint(10,10);
CGPoint p2 = CGPointMake(10,10); // 最常用
CGPointZero // 表示原点,等价于CGPointMake(0,0)
//输出时可以
NSLog(@”x = %f, y = %f”,p1.origin.x, p1.origin.y );
//或者转换成字符串在输出
NNString * str = NSStringFromPoint(p1);
NSLog(@”%@”,str ); // { 10,10}
3、NSSize\CGSize // 定义宽和高
NSSize p3 =NSMakeSize (100,50);
CGSize p4 = CGPointSize (100,50); // 最常用
CGSizeZero //等价于CGPointSize (0,0)
输出时可以
NSLog(@”width= %f, height = %f”,p3.size.width, p3.size.height );
或者转换成字符串在输出(常用)
NNString * str = NSStringFromsize(p3);
NSLog(@”%@”,str ); // { 100,50}
4、NSRect\CGRect //定点开始的宽和高
CGRect r1 = CGRectMake(1, 4 , 6, 7);
CGRect r2 = { {2, 3}, {5, 8}};
CGRect r2 = { p1, p3};
CGRect r2 = { CGSizeZero, CGPointZero};
CGRectZero // {{0, 0}, {0 , 0}}
//字符串输出
NNString * str = CGRect(r2);
NSLog(@”%@”,str ); //{ {2, 3}, {5, 8}}
5、比较返回BOOL类型,成立返回1 不成立返回0
BOOL b = CGPointEqualtToPoint(CGPointMake(12, 12), CGPointMake(12,12) );
// 类似函数CGSizeEqualtToSize CGRectEqualtToRect
CGRectEqualtToPoint // 判断某个点是否在这个范围内
BOOL d = CGRectEqualtToPoint(CGRectMake(50, 40, 100, 50), CGPointMake(90,70)
NSLog(@”%d”,d); // 成立返回1 不成立返回0
1.NSString类的操作
使用NSString类的对象初始化方法创建字符串
创建无参数的字符串
NSString *str2 = [[NSString alloc] initWithString:@"Jack"];
创建带参数的字符串
NSString *str3 = [[NSString alloc] initWithFormat:@"age is %d",10];
C字符串 转换为 OC字符串
NSString *str4 = [[NSString alloc] initWithUTF8String:"Rose"];
OC字符串 转换为 C字符串
const char c = [str4 UTF8String];
读取文件内容第一种方式:
读取桌面下 getWeather.xml 文件里的所有内容
NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/getWeather.xml" encoding:NSUTF8StringEncoding error:nil];
NSUTF8StringEncoding 适用于使用中文的编码格式
读取文件内容第二种方式
URL:资源路径 格式为:协议头://
比如本地文件的URL格式:file://
网络文件的URL格式:http://
服务器文件的URL格式:ftp://
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
如果访问网络就可以定义:http://www.baidu.com
NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSLog(@"/n%@",str6);
使用NSString类方法创建字符串
创建无参数的字符串
NSString *str2 = [NSString stringWithString:@"Jack"];
创建带参数的字符串
NSString *str3 = [NSString stringWithFormat:@"age is %d",10];
C字符串 转换为 OC字符串
NSString *str4 = [NSString stringWithUTF8String:"Rose"];
读取文件内容第一种方式:
读取桌面下getWeather.xml文件里的所有内容
NSString *str5 = [NSString stringWithContentsOfFile:@"file:///Users/apple/Desktop/getWeather.xml" encoding:NSUTF8StringEncoding error:nil];
NSUTF8StringEncoding 适用于使用中文的编码格式
读取文件内容第二种方式:
读取桌面下getWeather.xml文件里的所有内容
NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
NSString *str6 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
可以看出实现同一个功能NSString提供了对象方法和类方法两种解决方式而类方法快捷方便,因此在实际开发中推荐使用类方法来操作字符串
将字符串写入到一个文件里
给目标文件中写入字符串,两种写入方式在写入之前都会将文件中的内容全部清空后再写入
第一种写入方式
atomically参数指写入不成功时要不要停止
[@",iOS" writeToFile:@"/Users/apple/Desktop/getWeather.xml"atomically:YESencoding:NSUTF8StringEncoding error:nil];
第二种写入方式
NSString *content = @"iOS,Java";
NSURL提供了直接定义本地URL的类方法
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/getWeather.xml"];
[content writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
2.NSMutableString类的操作
NSMutableString继承自NSString
那么NSMutableString可以使用NSString类中的任意方法 NSMutableString提供了自己独有的方法
NSString *str = [NSString stringWithFormat:@"My age is 10 "];
NSString *str2 = [str stringByAppendingString:@"11 12"];
NSLog(@"%@",str2); // 打印:My age is 10 11 12
NSMutableString *mutalbeStr = [NSMutableString stringWithFormat:@"My age is 10 "];
[mutalbeStr appendString:@"11 12"];
// appendString方法没有返回值,说明是直接str字符串后面进行拼接
NSLog(@"%@",mutalbeStr); // 打印:My age is 10 11 12
可以看出:NSString一旦定义了str字符串它本身就不可变了,虽然NSString类方法也提供了拼接的方法如stringByAppendString方法但是它返回的是一个新的字符串。 而NSMutableString提供的拼接方法appendString方法是在原有的字符串上直接拼接它没有返回值。这就是可变和不可变字符串的本质
// NSMutableString 提供了删除方法,比如说要删掉上面可变字符串中的11有两种方式:
第一种 :
必须要清楚要删除内容的location和length,11在整个字符串中的loc = 11 length = 2 (不推荐使用) [mutalbeStr deleteCharactersInRange:NSMakeRange(13, 2)];
第二种:
先获取要删除内容的范围,然后删除范围内的字符串
NSRange range = [mutalbeStr rangeOfString:@"11"];
[mutalbeStr deleteCharactersInRange:range];
NSLog(@"%@",mutalbeStr); // 打印:My age is 10 12
2.OC集合类的操作
(1) OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 (2) OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加*
(3) NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变
(4) NSArray数组和子类NSMutableArray的基本操作
使用NSArray的类方法arry创建个数组
创建时定义为空数组,那么array数组将永远是空数组
NSArray *array = [NSArray array];
NSArray的常见操作:
创建数组对象有两种方式
第一种方式:
NSArray *array = [NSArray arrayWithObjects:@"Jack",nil];
数组中包含了两个NSString对象 nil是用来标识数组元素结束的标识
因此OC数组中不能存放空对象
NSArray *array1 = [NSArray arrayWithObjects:@"Jack",@"Rose", nil];
第二种方式:(推荐使用)
NSArray *array2 = @[@"Jack",@"Rose"];
获取数组的长度
array1.count;
NSUInteger count = [array1 count];
NSLog(@"%ld",count);
访问数组中的对象的两种方式
NSString *str1 = [array1 objectAtIndex:0];
数组中索引为1的对象,OC中提供的方法 返回:Jack NSString *str2 = array1[0];
编译器特性其实还是转为上面的形式来访问 返回:Jack
遍历数组的三种方式
第一种:
for (int i = 0; i<array1.count; i++)
{ NSLog(@"%@",array1[i]); // 数组中存放的是对象可以用%@输出 if (i ==0) { break; }
}
第二种:
将array1数组中的每个对象拿出来赋给obj然后依次打印
for (id obj in array1)
{ // id obj 代表数组中的对象 // 获取obj对象在数组中的索引NSUInteger index = [array1 indexOfObject:obj]; NSLog(@"%ld-->%@",index,obj);
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
第三种:
使用Block 每次从数组中遍历一个元素后就传递给block,block也相应的执行一次
block中的id obj对应数组中的元素,NSUInteger idx对应数组中元素的索引 BOOL用来停止遍历
[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%ld-->%@",idx,obj); // 如果索引为0 立即停止遍历 if (idx ==0) {*stop = YES; }
}];
NSMutableArray的基本操作:
创建可变数组
NSMutableArray *mutableArray = [NSMutableArray array];
NSMutableArray *mutalbeArray2 = @[@"张三",@"李斯"];
注意:@[]返回的是不可变NSArray数组 这样会报错
为可变数组增加任意对象
Person *person = [[Person alloc] init];
[mutableArray addObject:person];
[mutableArray addObject:@"Jack"];
[mutableArray addObject:@"John"];
[mutableArray addObject:10]; 数组中不可以存放基本数据类型
从数组中删除指定的元素
[mutableArray removeObject:@"John"];
[mutableArray removeObjectAtIndex:0];
将数组中的元素全部删除
[mutableArray removeAllObjects];
NSSet数组和子类NSMutableSet的基本操作
NSSet和NSArray都是不可变数组,一旦创建就无法改变。
NSSet是无序的集合简单操作:
创建NSSet集合
NSSet *set = [NSSet set]; // 一旦创建为空永远为空
NSSet *set2 = [NSSet setWithObjects:@"Jack",@"Rose",@"Jim",nil];
随机获取NSSet集合中的元素
NSString *str = [set2 anyObject];
NSLog(@"%@",str);
NSMutableSet的简单操作:
创建可变set集合
NSMutableSet *mutableSet = [NSMutableSet set];
为set添加集合
[mutableSet addObject:@"Jack"];
[mutableSet addObject:@"Rose"];
删除元素
[mutableSet removeObject:@"Jack"];
(6) NSArray和NSSet数组的对比
都是可以存放任意类型的OC对象的集合,都不能存放基本数据类型 本身都是不可变的,但是子类都是可变的 NSArray是有序的集合,NSSet是无序的集合
(7) NSDictionary和NSMutableDictionary
NSDictionary和它的子类NSMutableDictionary都是以key/value的形式存在,NSDictionary本身为不可变集合 NSDictionary也是无序集合 字典集合中存储的值是以键值对的形式存在,如果存在相同的key那么后面key的值会被覆盖。但是允许vaule的重复
NSDictionary的基本操作
常见创建Dictionary集合的四种方式
1.创建一个空的字典集合类型
NSDictionary *dic = [NSDictionary dictionary]; // 一旦为空 永久为空
2.创建只有一组值的字典集合
NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"Jack" forKey:@"name"];
3.创建多个值的字典集合
NSArray *keys = @[@"name",@"address",@"e-mail"];
NSArray *values = @[@"Jack",@"北京",@"jack@163.com"];
NSDictionary *dic3 = [NSDictionary dictionaryWithObjects:values forKeys:keys];
4.通过值/键的方式来创建
NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:
@"Jack",@"name", @"北京",@"address", @"jack@163.com",@"e-mail",nil];
5.类似于数组的创建方式 (推荐使用)
NSDictionary *dic5 = @{@"name":@"Jack", @"address":@"北京", @"e-mail":@"jack@163.com"};
取值:
根据相应的Key取出对应的值
NSString *name = [dic1 objectForKey:@"name"]; // 返回 Jack // 返回键值对的个数
NSUInteger count = dic5.count; // 返回 4
遍历NSDictionary数组用两种方式:
第一种方式:
获取字典中所有的键
NSArray *allKeys = [dic5 allKeys]; // 获取的键在数组中是无序的
for (int i = 0; i < dic5.count; i++) { NSString *key = allKeys[i]; NSString *value = dic5[key];NSLog(@"%@-->%@",key,value);
} <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
第二种方式:
将字典中的键值对传递给Block中的key和obj
[dic5 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@-->%@",key,obj); // 遍历一次立即停止 *stop = YES; }];
NSMutableDictionary的基本操作
创建可变字典
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
NSMutableDictionary *mutableDic2 = @{@"name",@"Rose",@"address",@"北京"};
错误的写法因为右边返回的是不可变的字典
为可变字典添加元素
[mutableDic setObject:@"Rose" forKey:@"name"];
[mutableDic setObject:@"北京" forKey:@"address"];
// 移除 [mutableDic removeAllObjects];
[mutableDic removeObjectForKey:@"name"];
// 打印 NSLog(@"%@",mutableDic);
// 输出:address = "\U5317\U4eac"; name = Rose; \U5317\U4eac 就是北京存储的形式 复制代码
(8) 设计一个通讯录里面包含了四个人的姓名、电话、地址 复制代码
NSArray *friends = @[ @{@"name":@"张三",@"phone":@"13993214321",@"address":@"北京"}, @{@"name":@"李斯",@"phone":@"13498766789",@"address":@"上海"}, @{@"name":@"王武",@"phone":@"15898766789",@"address":@"天津"}, @{@"name":@"赵柳",@"phone":@"18798766789",@"address":@"南京"}]; // 获取‘李斯’的通讯录信息
NSDictionary *dic = friends[1]; NSLog(@"%@",dic);
OC--Foundation框架相关推荐
- OC Foundation框架—字符串
一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:OC不可变数组 NSMutableA ...
- iOS - OC Foundation 框架
前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...
- [OC Foundation框架 - 9] NSMutableArray
可变的NSArray,可以随意添加OC对象 1.创建 1 void arrayCreate()2 {3 NSMutableArray *array = [NSMutableArray arrayWit ...
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...
- OC高级foundation框架类以及数据的简单存储
Objective-c高级复习 第一章 Foundation框架介绍 Foundation.framework是iOS开发的核心框架之 第二章 一.NSNumber OC的数字类型(存储C语言中简单的 ...
- 黑马程序员——OC基础05—Foundation框架
--Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- 一.Foundation框架 1.Foundation就是类.方法.函数.文档等按照一定的逻辑组织起来的集合., ...
- 黑马程序员--OC之Foundation框架的使用
黑马程序员--OC之Foundation框架的使用 ------- <a href="http://www.itheima.com" target="blank&q ...
- Foundation框架: 11.NSDate的基本认识和使用
学到这里, 我们基本上就把Foundation框架里面的东西学的七七八八了, 剩下的就只有UIKit, 也就是我们的UI部分,好了, 废话不多说, 现在我们来看看NSDate是干嘛用的吧. 例子: # ...
- Objective-C( Foundation框架 一 常见的结构体)
常见的结构体 (NSPoint,CGPoint).(NSRange,CGRange).(NSSize,CGSize) 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的 ...
- 李洪强iOS开发之Foundation框架—结构体
Foundation框架-结构体 一.基本知识 Foundation-基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...
最新文章
- python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号; 而list区分元素用逗号
- 保护 wp cron.php,wp-cron.php任务的定时执行和控制
- 关于MySQL线程池,这也许是目前最全面的实用帖!(转载)
- python调用rust_在 Rust 代码中编写 Python 是种怎样的体验?
- 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
- MySQL 成薪资跳板了?
- 《Gabor feature based sparse representation for face recognition with gabor occlusion dictionary》
- springboot之idea多模块
- linux alias命令
- 64位 windows10下 Apache2.4 + php7 + phpstorm 相关设置
- POJ_2258 The settlers of Catan (DFS)
- 阿里云服务器DDoS基础防护设置及常见问题
- 晶体二极管的分类大全
- 杭州电子科技大学 计算机专硕复试分数线,2020杭州电子科技大学考研复试分数线已公布...
- 时间换算--C语言结构练习
- webpack解惑:require的五种用法
- 非正式组织,比你预想的要重要的多
- vela和鸿蒙,小米Vela系统发布,将对标华为鸿蒙OS
- python能够设置标签背景色的属性是_Python Pmw EntryField背景色属性
- Shiro使用和原理分析---2