IOS基础入门OC语言Xcode Day07笔记:OC基础知识总结(属性关键字、数组、字典、截取替换字符串、正则校验、可变字符串)

1、属性关键字
属性(properties):用于访问类的外部类的变量属性。
1)读写属性:readwrite(默认) readonly
2)原子性:atomic(默认) nonatomic
3)引用计数
strong(ARC)(默认)/return(MRC) 这俩个关键字都是用来修饰对象的
assign/unsafe_unretained(MRC) assign既可以修饰基本数据类型,也可以修饰对象类型
atomic修饰的属性: 可以保证对该成员变量的赋值和获取数据是线程安全的
如果我们用atomic修饰了一个数组,那么对这个数组进行赋值和获取,是可以 保证线程安全的,但如果我们对数组进行操作,添加或移除对象,那么是不在 atomic的负责范围内,所以是没有办法保证线程安全的

assign
a)修饰基本数据类型,如int, BOOL等
b)修饰对象类型时,不改变其引用计数
c)会产生悬垂指针: assign所修饰的对象,在被释放之后,assign指针仍指向原对象内存地址,如果这时通过assign指针,继续访问原对象,会导致内存泄露或程序异常

weak
a)不改变被修饰对象的引用计数,一般使用weak是用来解决循环引用问题
b)所修饰的对象在被释放之后会自动置为nil
weak和assign的区别
a)weak可以修饰对象,assign既可以修饰对象,也可以修饰基本数据类型
b)weak所修饰的对象,在被废弃之后,weak指针置为nil. assign所修饰的对象,在被释放之后,assign指针仍指向原对象内存地址

weak和assign的联系
在修饰对象时,weak和assign都不改变被修饰对象的引用计数

copy
可变对象的copy和mutableCopy都是深拷贝。
不可变对象的copy是浅拷贝,mutableCopy是深拷贝。
copy方法返回的都是不可变对象;
深拷贝与浅拷贝
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。会增加对象的引用计数;没有发生新的内存分配。
深拷贝让目标对象指针和源对象指针指向两片内容相同的内存空间。不会增加对象的引用计数;产生了新的内存空间分配。

2、数组
NSArray(可变数组)是一个静态数组,不能修改该数组中的元素,也不能往该数组中添加元素。
NSMutableArray(可变数组)是一个可修改、可添加的元素。
NSArray类是NSMutableArray类的父类。在OC中,数组是有序的对象的集合,也可以说数组只能存储对象,而且数组中元素类型不能是int,float,CGPoint等类型。

3、字典
字典 :key与value组合成的键值对的集合
特点: 无序的 ,存的都是对象类型
NSDictionary:不可变字典
a)[NSDictionary dictionaryWithObjectsAndKeys:…]: 使用键值对儿直接创建字典对象,结尾必需使用nil标志结束。
b)[NSDictionary initWithObjectsAndKeys:…]:使用键值对儿初始化字典对象,结尾必需使用nil标志结束。
c)[dictionary count]: 得到字典的长度单位。
d)[dictionary keyEnumerator]: 将字典的所有KEY储存在NSEnumerator中,NSEnumerator很像Java语言中的迭代器,使用快速枚举可以遍历字典中所有储存KEY值。
e)[dictionary objectEnumerator]: 将字典的所有value储存在NSEnumerator中,用法和上面差不多可用来遍历KEY对应储存的Value值。
f)[dictionary objectForKey:key]: 通过传入KEY对象可以拿到当前KEY对应储存的值。
NSMutableDictionary :(可变字典)
NSMutableDictionary 是NSDictionary的子类,所以继承了NSDictionary的方法。
a)[NSMutableDictionary dictionaryWithCapacity:5]: 创建一个可变字典初始指定它的长度为5.,
动态的添加数据如果超过5这个词典长度会自动增加,所以不用担心数组越界,推荐用这种方式。
b)[NSMutableDictionary initWithCapacity:5]:只是初始化一个字典的长度为5。
c)[dictionary setObject:@“value” forKey:@“key”]:向可变的字典动态的添加数据 。
如果字典中存在这个KEY的数据则直接替换这个KEY的值。
d)[dictionary removeAllObjects…]: 删除掉词典中的所有数据。
e)[dictionary removeObjectForKey…]:删除掉词典中指定KEY的数据 。

4、self.button = nil和_button = nil的区别
Self.button是调用button属性的get/set方法,而_button则只是使用成员变量_button,并不会调用get/set方法。

5、截取、替换字符串操作
a)截取指定字符串
NSString *string = @“abavavasdsvx,as.dsf/,.[abcdefghijklmn]dgdfg”;
NSRange start = [string rangeOfString:@"["];
NSRange end = [string rangeOfString:@"]"];
NSString *sub = [string substringWithRange:NSMakeRange(start.location, end.location-start.location+1)];
NSLog(@“sub=%@”,sub);
控制台就输出:[abcdefghijklmn]

b)截取到第n位

  • (void)viewDidLoad
    {
    NSString *a = @“i like long dress”;
    NSString *b = [a substringToIndex:4];
    NSLog(@"\n b: %@",b);
    控制台输出: b: i li

c)从第n位开始截取,直到最后

  • (void)viewDidLoad
    {
    NSString *a = @“i like long dress”;
    NSString *b = [a substringFromIndex:4];
    NSLog(@"\n b: %@",b);
    }
    控制台输出: b: ke long dress

d)根据下标截取字符串
NSString*string =@“sdfsfsfsAdfsdf”;
string = [string substringToIndex:7];//截取掉下标7之后的字符串
NSLog(@“截取的值为:%@”,string);
[string substringFromIndex:2];//截取掉下标2之前的字符串
NSLog(@“截取的值为:%@”,string);

e)匹配字符串
NSString*string =@“sdfsfsfsAdfsdf”;
NSRangerange = [stringrangeOfString:@“f”];//匹配得到的下标
NSLog(@“rang:%@”,NSStringFromRange(range));
string = [string substringWithRange:range];//截取范围类的字符串
NSLog(@“截取的值为:%@”,string);

f)分隔字符串
NSString*string =@“sdfsfsfsAdfsdf”;
NSArray *array = [string componentsSeparatedByString:@“A”]; //从字符A 中分隔成2个元素的数组
NSLog(@“array:%@”,array); //结果是adfsfsfs和dfsdf

g)替换字符串
例如:将字符串中所有带有“-”的字符,都替换成“→”,然后将其更改颜色
NSString *pointStr = @“→”;
NSString *trafficStr = @“要我知道-你还得-等放假恩发-第三方的-的发热及 “;
NSString *strUrl = [trafficStr stringByReplacingOccurrencesOfString:@”-”
withString:pointStr]; //这里就是替换字符串这里是通过将字符串中“-”拆 分成一个数组里
NSMutableAttributedString *strP=
[[NSMutableAttributedStringalloc]initWithString:strUrl];
NSInteger rangeMin = 0;
int i = 0;
NSMutableArray *tempArr = trafficArr.mutableCopy;
[tempArr removeLastObject];
for (NSString *tempstr in tempArr) {
NSInteger tempStrLenth = tempstr.length;
rangeMin += tempStrLenth;
NSRange range = {rangeMin+i,1
}; // 这里是遍历拆分好的数组中每 一个字符串,从而得知要替换的“-” 的下标位置
NSLog(@“range%lu , %d”,(unsigned long)range.location, i);
[strP addAttribute:NSForegroundColorAttributeName value:
[UIColor colorWithHexString:@"#23beae"] range:range];
[strP addAttribute:NSFontAttributeName value:
[UIFont systemFontOfSize:20] range:range];
i++;
cell.traffic.attributedText = strP;
}

6、正则校验
a)常用符号及意义
^ 用在表达式的开头表示一个正则表达是的开始
$ 表示字符串的结尾

[ ] 中的表达式限定一个字符
如: ^ [a-z]:限定为小写字母 [A-Z]:限定为大写字母 [0-9]:限定为数字
( ) 限定一个子串
如: ^([a-z]{4})([0-9]{3}) 表示 由4个小写字母后边接三个数字构成的字符串 即,abcd332 adfd453 等

{m} m个符合限定的字符
如: ^ [a-z]{3} 表示由三个小写字母构成的字符串 即 add bcd ade 等
{m,} 大于或等于m个符合限定的字符
如: ^ [a-z]{3,} 表示由三个以上小写字母构成的字符串 即, acd ,bcd , adsf, sadfasdfasdf, 等
{m,n} m到n个符合限定的字符
如: ^ [a-z]{3,5} 表示3到5个小写字母构成的字符串 即, adb adsb asdfd 等

*     表示0个或多个 符合限定的字符
 		如:^ [a-z]* 表示有0个或多个小写字母构成的字符串

? 表示0个或一个 符合限定的字符
+ 表示一个或多个 符合限定的字符
注意: 没有限定符标记的即为单字符 , 其中 m ,n 为非负整数,n > m

[ ^ ] ^在[]里边代表非得意思
如: ^ [ ^a-z] 表示除了一个小写字母外的字符
| 或
如: ^ [a-z]|[0-9] 表示一个小写字母或者数字

?= 用圆括号包括,表示检查符合括号内规则的字符 如: (?= [0-9]{0-7}) 表示前7位全为数字
?! 用圆括号包括,表示检查不符合括号内规则的字符 如: (?! [0-9]{0-7}) 表示前7位不全为数字

b) 常用正则表达式
(1).用户名
“^ [a-zA-Z][a-zA-Z0-9_]{5,15}$” (由6-16位字母数字下划线组成,第一位不 能为数字或下划线)
[a-zA-Z] 表示第一位为字母 ;
[a-zA-Z0-9] 表示字符为字母数字或者下滑线;
{5,15} 表示有5到15个符合[a-zA-Z0-9]的字符

(2).密码
"^(?![0-9]{0,24})[\S]{6,24}$ " ( 6-24位,不能为纯数字,不能包含空格)
(?![0-9]{0,24}$) 表示前24位不能全为数字
\S 表示任何非空白字符(不为空格,回车,tab等输入的空白符)
[\S]{6,24} 表示6到24位不为空格的字符

(3).手机号
“^1[3|4|5|7|8][0-9]{9}$” (只是一个大概,不能完全精确筛选)
1 表示第一位为1
[3|4|5|7|8] 表示第二位为 3,4,5,6,7,或者8

(4).email

"^ [a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)@[a-zA-Z0-9_-]+.com(.cn)?$" (格式 用户名@邮箱网站.com 或 用户.名@邮箱网站.com.cn )
[a-zA-Z0-9_-]+ 表示1位或多位字母数字下划线和连接符
(.[a-zA-Z0-9_-]+)
表示 0个或多个 由一个点.和一个或多个字母数字下划 线连接符组成的字符串

7、可变字符串NSMutable
a)创建一个可变字符串
NSMutableString * ms1 = [[NSMutableString alloc]init];
NSMutableString * ms2 = [NSMutableString string]; //类方法
ms1 = [NSMutableString stringWithFormat:@"%d",12]; //格式化方法
ms1 = [[NSMutableString alloc]initWithCapacity:10]; //指定初始化大小
ms2 = [NSMutableString stringWithString:ms1]; //指定字符串创建

b)拼接字符串
[ms1 appendString:@“欢迎”];
[ms1 appendFormat:@"%@",@“来到德莱联盟”]; //格式化拼接

c)插入字符串
[ms1 insertString:@“天气” atIndex:3]; //位置

d)替换字符串
[ms1 replaceCharactersInRange:NSMakeRange(0, 3) withString:
@“乌 鸦”];

e)删除字符串
[ms1 deleteCharactersInRange:NSMakeRange(3,5)];

f)设置内容
[ms1 setString:@“不灭械国”];

你可能感兴趣的:(IOS基础笔记)