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框架相关推荐

  1. OC Foundation框架—字符串

    一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:OC不可变数组 NSMutableA ...

  2. iOS - OC Foundation 框架

    前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...

  3. [OC Foundation框架 - 9] NSMutableArray

    可变的NSArray,可以随意添加OC对象 1.创建 1 void arrayCreate()2 {3 NSMutableArray *array = [NSMutableArray arrayWit ...

  4. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  5. OC高级foundation框架类以及数据的简单存储

    Objective-c高级复习 第一章 Foundation框架介绍 Foundation.framework是iOS开发的核心框架之 第二章 一.NSNumber OC的数字类型(存储C语言中简单的 ...

  6. 黑马程序员——OC基础05—Foundation框架

    --Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- 一.Foundation框架 1.Foundation就是类.方法.函数.文档等按照一定的逻辑组织起来的集合., ...

  7. 黑马程序员--OC之Foundation框架的使用

    黑马程序员--OC之Foundation框架的使用 ------- <a href="http://www.itheima.com" target="blank&q ...

  8. Foundation框架: 11.NSDate的基本认识和使用

    学到这里, 我们基本上就把Foundation框架里面的东西学的七七八八了, 剩下的就只有UIKit, 也就是我们的UI部分,好了, 废话不多说, 现在我们来看看NSDate是干嘛用的吧. 例子: # ...

  9. Objective-C( Foundation框架 一 常见的结构体)

    常见的结构体 (NSPoint,CGPoint).(NSRange,CGRange).(NSSize,CGSize) 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的 ...

  10. 李洪强iOS开发之Foundation框架—结构体

    Foundation框架-结构体 一.基本知识 Foundation-基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...

最新文章

  1. python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号;  而list区分元素用逗号
  2. 保护 wp cron.php,wp-cron.php任务的定时执行和控制
  3. 关于MySQL线程池,这也许是目前最全面的实用帖!(转载)
  4. python调用rust_在 Rust 代码中编写 Python 是种怎样的体验?
  5. 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
  6. MySQL 成薪资跳板了?
  7. 《Gabor feature based sparse representation for face recognition with gabor occlusion dictionary》
  8. springboot之idea多模块
  9. linux alias命令
  10. 64位 windows10下 Apache2.4 + php7 + phpstorm 相关设置
  11. POJ_2258 The settlers of Catan (DFS)
  12. 阿里云服务器DDoS基础防护设置及常见问题
  13. 晶体二极管的分类大全
  14. 杭州电子科技大学 计算机专硕复试分数线,2020杭州电子科技大学考研复试分数线已公布...
  15. 时间换算--C语言结构练习
  16. webpack解惑:require的五种用法
  17. 非正式组织,比你预想的要重要的多
  18. vela和鸿蒙,小米Vela系统发布,将对标华为鸿蒙OS
  19. python能够设置标签背景色的属性是_Python Pmw EntryField背景色属性
  20. Shiro使用和原理分析---2

热门文章

  1. 通过PS合成电影场景里海怪的场景
  2. 微机原理与接口技术--西安电子科技大学-笔记一
  3. 致曾经那个优秀的女孩儿
  4. organici iherb2
  5. 英勇地死去 VS 卑贱地活着
  6. vb html单选按钮,VB常用控件属性讲解--单选按钮、复选框总结
  7. 基于vue的开源管理系统模板
  8. 实现物联网的技术要素
  9. 某单位分配到一个C类网络地址,其网络号为218.7.8.0,现在该单位共有4个不同的部门,每个部门最多25台主机,要求进行子网划分
  10. STM32-(ADC,DMA,重映射)