ios9基础知识总结(一)
I--load
类被加载时自动调用,只要类的项目中,运行时就会加载。类一加载,此方法就会调用
//类被加载时调用,只要类的项目中,运行时就会加载,类一加载,此方法就调用
+ (void)load
{
NSLog(@"load方法被调用");
}
//当使用这个类第一次创建对象时,或第一次调用类方法时,需要初始化一下这个类,该方法会被调用
load initialize 只有类实例化的第一次的时候才能被调用 以后都不调用
+initialize
当使用这个类第一次创建对象时,需要初始化一下这个类,该方法会被调用。实际开发中,经常再次方法中初始化一些static的全局变量。第一次使用这个类是自动调用。第一次创建对象;第一次使用类方法
//当使用这个类第一次创建对象时,或第一次调用类方法时,需要初始化一下这个类,该方法会被调用
+ (void)initialize
{
NSLog(@"initialize方法被调用");
//实际开发中,经常在此方法中初始化一些static的全局变量
currentMusic = @"Lemon Tree";
}
-copy
返回一个复制的新对象。会调用对象的copyWithZone方法。需要对象的类型遵守NSCopying协议
// copy代表set方法会release旧对象、copy新对象
// 修改外面的变量,并不会影响到内部的成员变量
// 建议:NSString一般用copy策略,其他对象一般用retain
#pragma mark copying协议的方法
// 这里创建的副本对象不要求释放
则需要重写父类的copying方法
- (id)copyWithZone:(NSZone *)zone {
Student *copy = [[[self class] allocWithZone:zone] init];
// 拷贝名字给副本对象
copy.name = self.name;
return copy;
}
只有一种情况是浅拷贝 不可变对象调用copy方法时 是浅拷贝
总结 对于copy的方法 对于不可变的对象都是浅拷贝 既指针复制 不可变的对象有 NSString、NSArray 而mutableCopy都是alloc一个新对象出来 并返回 对于可变的对象mutableCopy、copy都是深拷贝 alloc新的对象并返回 可变的对象有 NSMutableString、NSMutableArray
不论是可变还是不可变 copy返回的对象都是不可变的 mutablecopy返回的对象都是可变的
容器类对象不论是可变还是不可变 copy mutablecopy返回的对象都是和之前一样的 都是浅拷贝
浅拷贝:指针拷贝 不会产生新的对象 原对象计数器的指针+1
-mutableCopy
返回一个赋值的新对象。会调用对象的mutableCopyWithZone:方法。需要对象的类型遵守mutableCopyWithZone:协议。返回的是可变对象
#pragma mark 可变字符串 mutableString的copy (深拷贝)
void mutableStringCopy()
{
NSMutableString *string = [NSMutableString stringWithFormat:@"余大强的年龄是%i",0];
//会产生一个新的对象 str的计数器为1
NSString *str = [string copy];
//copy 返回的都是不可变的字符串NSString
[str release];
}
//copy语法的目的:改变副本的时候不会影响到原对象
#pragma mark 演示字符串string的拷贝mutablecopy(深拷贝)
void stringMutableCopy()
{
NSString *string = [[NSString alloc]initWithFormat:@"余大强的 age = %zi",22];
NSMutableString *str = [string mutableCopy];
//mutableCopy返回的对象都是可变的对象NSMutableString
NSLog(@"str:%zi", [str retainCount]);
NSLog(@"string:%zi", [string retainCount]);
NSLog(@"%@",string);
// str和string不是相同对象
// NSLog(@"%i", str == string);
// NSLog(@"%zi",&string);
// NSLog(@"%zi",&str);
// appendString在字符串的尾部追加字符串
//字符串的追加 append 一种是按照格式的追加 一种是直接加字符串
[str appendFormat: @"%d",22];
[str appendString:@" abcd"];
NSLog(@"str:%@", str);
[str release];
[string release];
}
+class
返回一个类的类对象 ,Class o =[TRExample class];不加*
+superClass
返回父类的类对象
+isSubclass
[TRExample isSubclassOfClass:[NSObject class]];判断一个类型是否是另一个类型的 子类
if ([TRExample isSubclassOfClass:[NSObject class]])
{
NSLog(@"是子类");
}
实际中常用的是:[e isKindOfClass:[TRExample class]];
— isKindOfClass 判断是否是同类型(一般指的是类的类型是否一致)
if([obj isKindOfClass:o])
//实际开发中的写法if([e isKindOfClass:[TRExample class]])
{
NSLog(@"obj引用指向的对象是TRExample类型");
}
else
{
NSLog(@"obj指向的对象不是我们需要的类型");
}
////判断引用指向的对象是否是这种类型或这个类的子类型
if([person isKindOfClass:[NSObject class]]){
NSLog(@"person指向的对象是NSObject类型");
}
if([person isKindOfClass:[TRPerson class]]){
NSLog(@"person指向的对象是TRPerson类型");
}
instancesRespondToSelector: 判断类的方法中是否有某方法
void test3()
{ //方法选择器对象,代表show方法
SEL sel = @selector(show);
BOOL res = [TRExample instancesRespondToSelector:sel];
//实际开发中的写法[TRExample instancesRespondToSelector:@selector(show)];
if(res)
{
NSLog(@"TRExample类中有实例方法show");
}
else
{
NSLog(@"TRExample类中没有实例方法show");
}
}
- respondsToSelector 询问引用指向的对象是否响应show方法
if([obj respondsToSelector:@selector(show)])
{
NSLog(@"obj指向的对象会响应show方法");
[obj show];
}
4.+ conformsToProtocol 判断一个类是否遵守指定的协议
void test4()
{
Protocol *p = @protocol(NSCopying);
//实际开发中的写法 if([TRExample conformsToProtocol:@protocol(NSCopying)]);
if([TRExample conformsToProtocol:p])
{
NSLog(@"类TRExample遵守NSCopying协议");
}
else
{
NSLog(@"类TRExample没有遵守NSCopying协议");
}
}
以上方法在实际开发中的写法 //实际开发中的写法
void test5()
{
TRExample *e = [TRExample new];
[e isKindOfClass:[TRExample class]];
[TRExample instancesRespondToSelector:@selector(show)];
[TRExample conformsToProtocol:@protocol(NSCopying)];
}
5.- performSelector 方法的调用
void test6()
{
id obj = [TRExample new];
//调用show方法
[obj show];
//调用show方法
[obj performSelector:@selector(show) withObject:nil];
}
+conformsToProtocol:
Protocol *p=@protocol(NSCopying);加*
BOOL b=[TRExample conformsToProtocol:p];
判断是否遵守协议
实际中:
[TRExample conformsToProtocol:@protocol(NSCopying)];
- isEqual 判断两个对象是否相等(包含属性)
TRPerson *person = [TRPerson new];
person.ID = @"1234567890";
person.name = @"Daniel";
person.age = 30;
Class c = [person class];
Class c2 = [TRPerson class];
TRPerson *person2 = [[TRPerson alloc]init];
person2.ID = @"1234567890";
person2.name = @"Daniel";
person2.age = 30;
if([person isEqual:person2]){ // ==
NSLog(@"两个对象是相等的");
}else{
NSLog(@"两个对象是不相等的");
}
//比较两个引用是否指向了同一个对象
if(person == person2){
NSLog(@"两个引用指向了同一个对象");
}else{
NSLog(@"两个引用指向了不同的对象");
}
}
两个引用指向的对象是否相等有两层含义:
1) 两个引用是否指向了同一个对象
2) 两个引用指向的对象内容(属性)是否相等。
如果需要比较两个引用是否指向了同一个对象,只要使用"=="号就可以判断了。
但如果需要比较两个引用指向的对象的内容(属性)是否相等,就得调用isEqual:方法来比较了。
isEqual 方法的重构与调用
- (BOOL)isEqual:(id)object
{
//判断是否是自己
if (self == object) return YES;
//判空
if (!object) return NO;
//是否是同类
if(![object isKindOfClass:[TRPerson class]]) return NO;
//如果是同类,做类型转换,再进行比较
TRPerson *person = object;
return [self.ID isEqual:person.ID] &&
[self.name isEqual:person.name] &&
self.age == person.age;
}
8.总结
+ alloc 分配内存空间
- init 初始化这片内存空间
+ load 类加载时自动调用,
程序运行时,所有类加载
+ initialize 第一次使用这个类时自动调用
第一次创建对象
第一次调用类方法
- copy 返回一个复制的新对象
会调用对象的copyWithZone:方法。需要对象的类型遵守NSCopying协议
返回的可能是不可变对象
- mutableCopy 返回一个复制的新对象
会调用对象的mutableCopyWithZone:方法。需要对象的类型遵守NSMutableCopying协议
返回的是可变对象
+ class
返回这个类的类对象
+ superclass
返回父类的类对象
+ isSubclassOfClass
判断一个类型是否是另一个类型的子类
+ instancesRespondToSelector:
判断这个类型的对象是否会响应指定的方法
- performSelector:withObject:
另一种调用对象方法的方式
2.4 方法选择器Selector
是一种特殊的对象,代表一个方法。
这种对象的类型是SEL,如何创建这种对象:
SEL sel = @selector(方法名);//不加*
比如:
@selector(initWithName:age:gender:salary:)
@selector(setName:)
//方法选择器Selector
void test3()
{ //方法选择器对象,代表show方法
SEL sel = @selector(show);
BOOL res = [TRExample instancesRespondToSelector:sel];
if(res)
{
NSLog(@"TRExample类中有实例方法show");
}
else
{
NSLog(@"TRExample类中没有实例方法show");
}
}
9. - initWithCString 将C风格的字符串转换成OC风格的字符串对象
char str[] = "Hai,Hello";
NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];
10.cStringUsingEncoding 将OC风格的字符串对象转换成C风格的字符串
const char *cstr = [str3 cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"cstr=%s", cstr);
NSString *str4 = [[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
NSLog(@"%@", str4);
NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
NSLog(@"%@", str5);
11.stringWithContentsOfFile 从文件中读取内容到字符串对象
NSString *str6 = [NSString stringWithContentsOfFile:@"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str6:%@", str6);
12.writeToFile 将字符串中的内容写到一个文件中
[str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
13.stringByAppendingString 合并,拼接字符串
NSString *str5 = @"ABC";
NSString *str6 = @"DEF";
NSString *str7 = [str5 stringByAppendingString:str6];
NSLog(@"str7:%@", str7);
str5 = [str5 stringByAppendingFormat:@"%02d:%02d:%02d",2,3,4];
NSLog(@"str5=%@", str5);
}
14.characterAtIndex 获取指定位置的字符
NSString *str4 = @"ABCDEFG";
char ch = [str4 characterAtIndex:0];
NSLog(@"%c", ch);
15.lengthOfBytesUsingEncoding 求字符串的长度
NSString *str2 = @"我们都是,好孩子";
NSLog(@"length:%ld", str2.length);
NSLog(@"lengthOfBytes:%ld", [str2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
16.componentsSeparatedByString 字符串分解方法
NSString *info = @"Daniel:30:1:123456.78";
NSArray *array = [info componentsSeparatedByString:@":"];
NSLog(@"array[0]=%@", array[0]);
NSLog(@"array[1]=%@", array[1]);
NSLog(@"array[2]=%@", array[2]);
NSString *str = @"ABCDEFGHIJKLMN";
//包括起始位置
NSString *str2 = [str substringFromIndex:8];
NSLog(@"str2=%@", str2);
//不包括结束位置
NSString *str3 = [str substringToIndex:8];
NSLog(@"str3=%@", str3);
NSRange r = NSMakeRange(2, 4);
NSString *str4 = [str substringWithRange:r];
NSLog(@"str4=%@", str4);
17.rangeOfString 查找子串
默认是大小写敏感
NSString *str = @"Hello World.";
NSRange r = [str rangeOfString:@"LLO"];
if (r.location == NSNotFound) {
NSLog(@"没有找着指定的子串");
}else{
NSLog(@"找着了,在%ld位置", r.location);
}
//忽略大小写查找子串
r = [str rangeOfString:@"LLO" options:NSCaseInsensitiveSearch];
if (r.length == 0){
NSLog(@"没找到指定的字符子串");
}else{
NSLog(@"找着了,在%ld位置", r.location);
}
18.stringByReplacingOccurrencesOfString 替换子串
NSString *str = @"TRHelloWorld.mm";
str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@".java"];
NSLog(@"str:%@", str);
str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];
NSLog(@"str:%@", str);
19.NSComparisonResult 比较大小
NSString *str1 = @"aab";
NSString *str2 = @"abc";
NSComparisonResult result = [str1 compare:str2];
if (result == NSOrderedAscending) {
NSLog(@"str1 < str2");
}else if(result == NSOrderedDescending){
NSLog(@"str1 > str2");
}else {
NSLog(@"str1 == str2");
}
str1 = @"abc";
str2 = @"ABC";
if([str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame){
NSLog(@"忽略大小写,两个字符串内容相同");
}
str1 = @"A10.txt";
str2 = @"A8.txt";
result = [str1 compare:str2 options:NSNumericSearch];//A10.txt > A8.txt
NSLog(@"result:%ld", result);
20.isEqualToString 比较内容是否相等
NSString *str1 = @"ABC";
NSString *str2 = @"ABC";
if(str1 == str2){
NSLog(@"str1和str2==");
}
NSString *str3 = [[NSString alloc]initWithFormat:@"%@", @"ABC"];
if(str1 == str3){
NSLog(@"str1和str3也==");
}
//NSString类中的isEqual:方法比较的是内容,但是,在实际开发中,对于字符串类,基本不会使用此方法去比较内容是否相等,一般用isEqualToString:
if([str1 isEqual:str3]){
NSLog(@"str1和str3内容相等");
}
//专门给字符串类定制的比较方法
if([str1 isEqualToString:str3]){
NSLog(@"str1和str3的内容肯定是相同的");
}
//判断是否是指定字符串开始或结束
NSString *filename = @"HelloWorld.mm";
if([filename hasPrefix:@"Hello"]){
NSLog(@"文件名以Hello开始");
}
if([filename hasSuffix:@".mm"]) {
NSLog(@"这个文件是Objective C++源文件");
}
20.改变大小写
void test9()
{
NSString *str = @"Hello World.";
str = [str lowercaseString];
NSLog(@"str:%@", str);
str = [str capitalizedString];
NSLog(@"str:%@", str);
}
21.将字符串转换成其他基本类型
void test10()
{
NSString *str1 = @"123";
int i1 = [str1 intValue];
NSLog(@"i1=%d", i1);
NSInteger i2 = [str1 integerValue];
NSLog(@"i2=%ld", i2);
NSString *str2 = @"3.1415926";
float f = [str2 floatValue];
NSLog(@"f=%f", f);
}
22.可变的字符串
void test1()
{
NSMutableString *str = [NSMutableString stringWithCapacity:1];
[str appendString:@"ABCDEFG"];
NSLog(@"str:%@", str);
}
23.stringFromDate 进行格式化(将日期转成字符串)
void test2()
{
//1.要处理的日期对象
NSDate *date = [NSDate date];
//2.准备格式对象
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
//3. 设置格式串属性
formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
//4. 进行格式化(将日期转成字符串)
NSString *formatString = [formatter stringFromDate:date];
NSLog(@"%@", formatString);
//将字符串转成日期
NSString *dateString = @"2016-01-01 02:03:04";
NSDate *date2 = [formatter dateFromString:dateString];
NSLog(@"%@", date2);
}
24.//
// main.m
// Demo2_NSArray
//
// Created by DanielGuo on 15/8/27.
// Copyright (c) 2015年 Tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
//创建数组NSArray对象
void test1()
{
//1. 字面值方式
NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];
//2. 工厂方法创建,最后一人元素必须是nil
NSArray *arr2 = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", nil];
NSString *strs[4] = {@"aaa", @"bbb", @"ccc", @"ddd"};
NSArray *arr3 = [NSArray arrayWithObjects:strs count:4];
NSLog(@"%@,%@,%@", arr1, arr2, arr3);
}
//遍历数组
void test2()
{
//数组中只能放对象(对象的引用),不能放非对象类型(C语言中的基本类型,结构体等),数组中的每个元素是id类型的引用
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
NSLog(@"0000%@", arr);
//1. 使用数组下标的方式进行遍历
for(int i=0; i<arr.count; i++){
NSString *str = arr[i];
NSLog(@"%@", str);
if(i == 2)break;
}
//2. 使用forin loop循环的方式进行遍历
for(NSString *str in arr){
NSLog(@"%@", str);
//if (不需要遍历了)break;
}
//3. 使用Block进行遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"下标为%lu的元素是%@", idx, obj);
if(idx == 2)*stop = YES;
}];
//4. 使用迭代器来遍历
NSEnumerator *enumerator = [arr objectEnumerator];//获取迭代器
NSString *obj = nil;
while(obj = [enumerator nextObject]){ //通过迭代器拿数组中的一个对象
NSLog(@"%@", obj);//对获得的对象进行处理
}
}
//数组的拷贝
void test3()
{
NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];
NSArray *arr2 = arr1;
//arr1[0] = @"AAA";//不可变,改不了
//浅拷贝
NSArray *arr3 = [[NSArray alloc]initWithArray:arr1 copyItems:NO];
//深拷贝
NSArray *arr4 = [[NSArray alloc]initWithArray:arr1 copyItems:YES];
}
//测试浅拷贝和深拷贝的区别
#import "TRPerson.h"
void test4()
{
TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];
TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];
TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];
NSArray *persons = @[p1, p2, p3];
//浅拷贝
NSArray *persons2 = [[NSArray alloc]initWithArray:persons copyItems:NO];
if(persons[0] == persons2[0]){
NSLog(@"这是同一个对象");
}
[persons[0] setAge:35];//persons[0].age = 35;
NSLog(@"%ld", [persons2[0] age]);
//深拷贝
NSArray *persons3 = [[NSArray alloc]initWithArray:persons copyItems:YES];
for (TRPerson *p in persons) {
NSLog(@"%p", p);
}
NSLog(@"===============");
for (TRPerson *p in persons2) {
NSLog(@"%p", p);
}
NSLog(@"===============");
for (TRPerson *p in persons3) {
NSLog(@"%p", p);
}
}
//常用方法
void test5()
{
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
NSString *str = [[NSString alloc]initWithFormat:@"%@",@"bbb"];
NSLog(@"arr[1]:%p,str:%p", arr[1], str);
NSLog(@"%@", str);
//判断数组中是否包含指定的对象,通过isEqual方法来判断的,而不是地址
if([arr containsObject:str]){
NSLog(@"数组中有这个对象");
}
TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];
TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];
TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];
NSArray *persons = @[p1, p2, p3];
TRPerson *p4 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];
//当调用[p3 isEqual:p4]时结果为YES,说明数组中有王小二这个人
if ([persons containsObject:p4]) {
NSLog(@"数组中有王小二");
}
NSLog(@"==============");
//从数组中查找对象,返回其下标,比较的是内容(isEqual:)
NSInteger index = [persons indexOfObject:p4];
if (index == NSNotFound) {
NSLog(@"没有王小二");
}else{
NSLog(@"王小二在下标%ld的位置", index);
}
NSLog(@"==============");
//下面方法比较的是地址(没有使用isEqual:方法)
index = [persons indexOfObjectIdenticalTo:p3];
if (index == NSNotFound) {
NSLog(@"数组中没有这个对象");
}else{
NSLog(@"对象的下标是:%ld", index);
}
//向数组中的每一个对象发消息
[persons makeObjectsPerformSelector:@selector(show)];
//相当于以下代码
/*
for (TRPerson *p in persons) {
[p show];
}
*/
}
//其他方法
void test6()
{
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
arr = [arr arrayByAddingObject:@"eee"];
NSLog(@"%@", arr);
}
//数组排序
NSInteger sortRule(id obj1, id obj2, void *p)
{
//NSLog(@"sortRule");
NSString *str1 = obj1;
NSString *str2 = obj2;
return [str1 compare:str2];
}
void test7()
{
NSArray *arr = @[@"aaa", @"ccc", @"bbb", @"ccc"];
NSArray *sortedArr = [arr sortedArrayUsingFunction:sortRule context:nil];
NSLog(@"%@", sortedArr);
arr = @[@"aaa", @"ccc", @"bbb", @"ccc"];
//调用字符串类中的compare:方法进行比较大小运算
sortedArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", sortedArr);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
test5();
}
return 0;
}
NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];
将C风格的字符串转换成OC风格的字符串对象
//将OC风格的字符串对象转换成C风格的字符串
const char *cstr = [str3 cStringUsingEncoding : NSUTF8StringEncoding];
将字符串按要求格式初始化
NSString *str4 =[[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
将字符串按要求格式输出
NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
从文件中读取内容到字符串对象
NSString *str6 = [NSString stringWithContentsOfFile:
@"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];
将字符串中的内容写到一个文件中
[str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
在Unicode编码中,一个汉字是一个字符,有几个汉字,长度就是几
NSString *str2 = @"我们都是,好孩子";
NSLog(@"length:%ld", str2.length);
获取指定位置的字符
NSString *str4 = @"ABCDEFG";
char ch = [str4 characterAtIndex:0];
合并,拼接字符串
NSString *str5 = @"ABC";
NSString *str6 = @"DEF";
NSString *str7 = [str5 stringByAppendingString:str6];
字符串分解方法
NSString *info = @"Daniel:30:1:123456.78";
NSArray *array=[info componentsSeparatedByString:@“:”];
//测试字符串对象
void test1()
{
//改变引用变量的值,没有改变对象的内容
NSString *str = @"Hello";
str = @"World";
NSLog(@"str=%@", str);
//字符串池的存在
NSString *str1 = @"ABCDEF";
NSString *str2 = @"ABCDEF";
NSLog(@"str1=%p,str2=%p", str1, str2);
if(str1 == str2){
NSLog(@"str1==str2");
}
str2 = @"DEF";
}
//创建和初始化字符串对象
void test2()
{
NSString *str1 = @"Hello";
NSString *str2 = [[NSString alloc]initWithString:str1];//@"World";
//将C风格的字符串转换成OC风格的字符串对象
char str[] = "Hai,Hello";
NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];
//将OC风格的字符串对象转换成C风格的字符串
const char *cstr = [str3 cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"cstr=%s", cstr);
NSString *str4 = [[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
NSLog(@"%@", str4);
NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];
NSLog(@"%@", str5);
//从文件中读取内容到字符串对象
NSString *str6 = [NSString stringWithContentsOfFile:@"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str6:%@", str6);
//将字符串中的内容写到一个文件中
[str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
//字符串的普通方法
void test3()
{
const char *str1 = "我们";//E68891
//NSLog(@"%X%X%X", *str1, *(str1+1), *(str1+2));
NSLog(@"strlen(str1)=%ld", strlen(str1));
//在Unicode编码中,一个汉字是一个字符,有几个汉字,长度就是几
NSString *str2 = @"我们都是,好孩子";
NSLog(@"length:%ld", str2.length);
NSLog(@"lengthOfBytes:%ld", [str2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
NSString *str3 = @"Hello World!";
NSLog(@"length:%ld", str3.length);
//获取指定位置的字符
NSString *str4 = @"ABCDEFG";
char ch = [str4 characterAtIndex:0];
NSLog(@"%c", ch);
//合并,拼接字符串
NSString *str5 = @"ABC";
NSString *str6 = @"DEF";
NSString *str7 = [str5 stringByAppendingString:str6];
NSLog(@"str7:%@", str7);
str5 = [str5 stringByAppendingFormat:@"%02d:%02d:%02d",2,3,4];
NSLog(@"str5=%@", str5);
}
//字符串分解方法
void test4()
{
NSString *info = @"Daniel:30:1:123456.78";
NSArray *array = [info componentsSeparatedByString:@":"];
NSLog(@"array[0]=%@", array[0]);
NSLog(@"array[1]=%@", array[1]);
NSLog(@"array[2]=%@", array[2]);
NSString *str = @"ABCDEFGHIJKLMN";
//包括起始位置
NSString *str2 = [str substringFromIndex:8];
NSLog(@"str2=%@", str2);
//不包括结束位置
NSString *str3 = [str substringToIndex:8];
NSLog(@"str3=%@", str3);
NSRange r = NSMakeRange(2, 4);
NSString *str4 = [str substringWithRange:r];
NSLog(@"str4=%@", str4);
}
//查找子串
void test5()
{
//默认是大小写敏感
NSString *str = @"Hello World.";
NSRange r = [str rangeOfString:@"LLO"];
if (r.location == NSNotFound) {
NSLog(@"没有找着指定的子串");
}else{
NSLog(@"找着了,在%ld位置", r.location);
}
//忽略大小写查找子串
r = [str rangeOfString:@"LLO" options:NSCaseInsensitiveSearch];
if (r.length == 0){
NSLog(@"没找到指定的字符子串");
}else{
NSLog(@"找着了,在%ld位置", r.location);
}
}
//替换子串
void test6()
{
NSString *str = @"TRHelloWorld.mm";
str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@".java"];
NSLog(@"str:%@", str);
str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];
NSLog(@"str:%@", str);
}
//比较大小
void test7()
{
NSString *str1 = @"aab";
NSString *str2 = @"abc";
NSComparisonResult result = [str1 compare:str2];
if (result == NSOrderedAscending) {
NSLog(@"str1 < str2");
}else if(result == NSOrderedDescending){
NSLog(@"str1 > str2");
}else {
NSLog(@"str1 == str2");
}
str1 = @"abc";
str2 = @"ABC";
if([str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame){
NSLog(@"忽略大小写,两个字符串内容相同");
}
str1 = @"A10.txt";
str2 = @"A8.txt";
result = [str1 compare:str2 options:NSNumericSearch];//A10.txt > A8.txt
NSLog(@"result:%ld", result);
}
//判等
void test8()
{
NSString *str1 = @"ABC";
NSString *str2 = @"ABC";
if(str1 == str2){
NSLog(@"str1和str2==");
}
NSString *str3 = [[NSString alloc]initWithFormat:@"%@", @"ABC"];
if(str1 == str3){
NSLog(@"str1和str3也==");
}
//NSString类中的isEqual:方法比较的是内容,但是,在实际开发中,对于字符串类,基本不会使用此方法去比较内容是否相等,一般用isEqualToString:
if([str1 isEqual:str3]){
NSLog(@"str1和str3内容相等");
}
//专门给字符串类定制的比较方法
if([str1 isEqualToString:str3]){
NSLog(@"str1和str3的内容肯定是相同的");
}
//判断是否是指定字符串开始或结束
NSString *filename = @"HelloWorld.mm";
if([filename hasPrefix:@"Hello"]){
NSLog(@"文件名以Hello开始");
}
if([filename hasSuffix:@".mm"]) {
NSLog(@"这个文件是Objective C++源文件");
}
}
//改变大小写
void test9()
{
NSString *str = @"Hello World.";
str = [str lowercaseString];
NSLog(@"str:%@", str);
str = [str capitalizedString];
NSLog(@"str:%@", str);
}
//将字符串转换成其他基本类型
void test10()
{
NSString *str1 = @"123";
int i1 = [str1 intValue];
NSLog(@"i1=%d", i1);
NSInteger i2 = [str1 integerValue];
NSLog(@"i2=%ld", i2);
NSString *str2 = @"3.1415926";
float f = [str2 floatValue];
NSLog(@"f=%f", f);
}
获取从第八个以后的字符串
NSString *str2 = [str substringFromIndex:8];
获取从第0个到第7个字符串
NSString *str3 = [str substringToIndex:8];
从第二个开始,获取四个字符串
NSRange r = NSMakeRange(2, 4);
NSString *str4 = [str substringWithRange:r];
查找子串,默认是大小写敏感
NSString *str = @"Hello World.";
NSRange r = [str rangeOfString:@“LLO"];
忽略大小写查找子串
r=[str rangeOfString:@“LLO" options:NSCaseInsensitiveSearch];
替换子串
str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@“.java"];
替换指定范围子串
str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];
比较大小
NSComparisonResult result = [str1 compare:str2];
忽略大小写
[str1 compare:str2 options:NSCaseInsensitiveSearch]
判断是否是指定字符串开始或结束
开始
[filename hasPrefix:@“Hello”]
结束
[filename hasSuffix:@“.mm"]
改变大小写
str = [str lowercaseString];
str = [str capitalizedString];
NSDate
目标时间距离现在时间差24*60*6秒,可变
NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60];
自1970年到现在的总秒数
NSTimeInterval sec = date.timeIntervalSince1970;
//格式化处理日期对象
//1.要处理的日期对象
NSDate *date = [NSDate date];
//2.准备格式对象
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
//3. 设置格式串属性
formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
//4. 进行格式化(将日期转成字符串)
NSString *formatString = [formatter stringFromDate:date];
//将字符串转成日期
NSString *dateString = @"2016-01-01 02:03:04";
NSDate *date2 = [formatter dateFromString:dateString];
NSArray
初始化
//1. 字面值方式
NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];
//2. 工厂方法创建,最后一人元素必须是nil
NSArray *arr2 = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", nil];
NSString *strs[4] = {@"aaa", @"bbb", @"ccc", @"ddd"}; NSArray *arr3 =[NSArray arrayWithObjects:strs count:4];
//遍历数组
//数组中只能放对象(对象的引用),不能放非对象类型(C语言中的基本类型,结构体等),数组中的每个元素是id类型的引用
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
NSLog(@"%@", arr);
//1. 使用数组下标的方式进行遍历
for(int i=0; i<arr.count; i++){
NSString *str = arr[i];
NSLog(@"%@", str);
if(i == 2)break;
}
//2. 使用forin loop循环的方式进行遍历
for(NSString *str in arr){
NSLog(@"%@", str);
//if (不需要遍历了)break;
}
//3. 使用Block进行遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"下标为%lu的元素是%@", idx, obj);
if(idx == 2)*stop = YES;
}];
4. 使用迭代器来遍历
NSEnumerator *enumerator = [arr objectEnumerator];
//获取迭代器
NSString *obj = nil;
while(obj = [enumerator nextObject]){ //通过迭代器拿数组中的一个对象
NSLog(@"%@", obj);//对获得的对象进行处理
}
数组的拷贝
//浅拷贝
NSArray *arr3 = [[NSArray alloc]initWithArray:arr1 copyItems:NO];
//深拷贝
NSArray *arr4 = [[NSArray alloc]initWithArray:arr1 copyItems:YES];
常用方法
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
NSString *str = [[NSString alloc]initWithFormat:@“%@",@"bbb"];
if([arr containsObject:str]){
NSLog(@"数组中有这个对象");
}
//从数组中查找对象,返回其下标,比较的是内容(isEqual:)
NSInteger index = [persons indexOfObject:p4];
if (index == NSNotFound) {
NSLog(@"没有王小二");
}else{
NSLog(@"王小二在下标%ld的位置", index);
}
//下面方法比较的是地址(没有使用isEqual:方法)
index = [persons indexOfObjectIdenticalTo:p4];
if (index == NSNotFound) {
NSLog(@"数组中没有这个对象");
}else{
NSLog(@"对象的下标是:%ld", index);
}
//添加一个字符串
NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];
arr = [arr arrayByAddingObject:@"eee"];
NSLog(@"%@", arr);
排序
//对自己定义的对象进行排序
NSInteger personSortRule(id obj1, id obj2, void*p)
{
TRPerson *person1 = obj1;
TRPerson *person2 = obj2;
if(person1.age < person2.age) return -1;
else if(person1.age > person2.age) return 1;
return 0;
}
void test8()
{
TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];
TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];
TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:26];
NSArray *persons = @[p1, p2, p3];
//要求按年龄进行排序
NSArray *sortedPersons = [persons sortedArrayUsingFunction:personSortRule context:nil];
//使用Block进行排序
sortedPersons = [persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
TRPerson *p1 = obj1;
TRPerson *p2 = obj2;
if(p1.age < p2.age) return NSOrderedAscending;
else if(p1.age > p2.age) return NSOrderedDescending;
return NSOrderedSame;
}];
NSArray *emps = @[e1, e2, e3, e4];
//key要的是参与排序的所有对象的某个属性的名字,如果参与排序的对象没有这个属性,排序会导致程序崩溃
NSSortDescriptor *desc1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSSortDescriptor *desc2 = [NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:YES];
NSArray *sortedEmps = [emps sortedArrayUsingDescriptors:@[desc1, desc2]];
NSSET
初始化
NSSet *set = [NSSet setWithObjects:@"aaa", @"bbb", @"ccc", @"aaa", nil];
NSSet ==> NSArray
NSArray *objs = [set allObjects];
从set中随便拿一个对象
NSString *str = [set anyObject];
[objs firstObject];//数组中的第一个元素
[objs lastObject];//最后的一个元素
//判断set中有没有指定的对象
if([set containsObject:@“ccc"])
遍历set
forin
for (NSString *str in set)
{
NSLog(@"%@", str);
}
//枚举器(迭代器)
NSEnumerator *enumerator = [set objectEnumerator];
NSString *str = nil;
while(str = [enumerator nextObject]) {//拿其中一个对象
NSLog(@"%@", str);
}
//使用Block
[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop)
{
NSString *str = obj;
NSLog(@"%@", str);
if([str isEqualToString:@"aaa"]){
*stop = YES;//终止遍历
}
}];
排序
//将set变成数组再进行排序
NSArray *sortedArray = [[set allObjects]sortedArrayUsingSelector:@selector(compare:)];
//Set间的计算
if([s2 isSubsetOfSet:s1])
{
NSLog(@"s2是s1的子集");
}
if([s1 intersectsSet:s3])
{
NSLog(@"s1和s3相交");
}
NSMutableSet
添加或修改set中的元素
NSMutableSet *mSet = [NSMutableSet new];
[mSet addObject:@"aaa"];
[mSet addObjectsFromArray:@[@"bbb", @"ccc", @“bbb"]];
[mSet removeObject:@“ccc"];
//集合运算
NSMutableSet *s1 = [NSMutableSet setWithObjects:@"A", @"B", @"C", nil];
NSMutableSet *s2 = [NSMutableSet setWithObjects:@"C", @"D", nil];
[s1 unionSet:s2]; s1=a,b,c,d
[s1 minusSet:s2]; s1=a,b
[s1 addObject:@"C"];
[s1 addObject:@"E"];//A B C E
[s1 intersectSet:s2] s1=c
[s1 setSet:s2]; s1=c,d
NSDictionary
初始化
NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"Daniel", @"30"] forKeys:@[@"name", @“age"]];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Guodh", @"name", @"32", @"age", @"male", @"gender",nil];
NSDictionary *dict3 = @{ @"name" : @"Guodenghong", @"age":@35, @“gender":@"male"};
//使用下标访问key对应的value
NSString *name = dict[@"name"];
NSString *gender = [dict objectForKeyedSubscript:@"gender"];
NSNumber *age = [dict objectForKey:@“age"];
遍历字典
//遍历一
NSArray *keys = [dict allKeys];
for (NSString *key in keys) {
id value = dict[key];
NSLog(@"%@:%@", key, value);
}
//遍历所所有value
NSArray *values = [dict allValues];
NSLog(@"%@", values);
//使用迭代器(枚举器)
NSEnumerator *enumerator = [dict keyEnumerator];
id key = nil;
while(key = [enumerator nextObject]) {
id value = dict[key];
NSLog(@"%@,%@", key, value);
}
//使用Block
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@:%@", key, obj);
}];
排序
NSDictionary *dict = @{@"Daniel":@10, @"Guodh":@15, @"Mengriri": @5, @"Qinxi":@25};
NSArray *keys = [dict keysSortedByValueUsingSelector:@selector(compare:)];
NSMutableDictionary
初始化
NSMutableDictionary *mDict = [NSMutableDictionary new];
[mDict setObject:@"Daniel" forKey:@"name"];
[mDict setObject:@"35" forKey:@"age"];
mDict[@"gender"] = @“male";
添加
mDict[@"age"] = @“36";
移除
[mDict removeObjectForKey:@"name"];
[mDict removeObjectsForKeys:@[@"age", @“gender"]];
重点:比较时一定要重写这两个方法
- (BOOL)isEqual:(id)object
{
if (self == object) {return YES;}
if (object == nil) {return NO;}
if (![object isKindOfClass:[self class]]) {
return NO;
}
TRHero *h = object;
return [self.title isEqualToString:h.title] && [self.name isEqualToString:h.name];
}
//确保相同对象的hash值一定相等,不同对象的hash值尽可能不等。
- (NSUInteger)hash
{
return self.power ^ self.title.hash ^ self.name.hash;
}
//将数组中所有的字典信息写入文件,要求字典中的key和value都是NSString或NSNumber等
void test1()
{
//用字典保存一个账户信息
NSDictionary *acc1 = @{
@"id" :@"1000001",
@"name":@"Daniel",
@"balance":@12340000.15,
@"loan":@8000000.0
};
NSDictionary *acc2 = @{
@"id" :@"1000002",
@"name":@"Shasha",
@"balance":@12340.0,
@"loan":@0.0
};
NSDictionary *acc3 = @{
@"id" :@"1000003",
@"name":@"Shanshan",
@"balance":@100000.0,
@"loan":@5000.0
};
NSDictionary *acc4 = @{
@"id" :@"1000004",
@"name":@"Lisa",
@"balance":@120000.0,
@"loan":@8000.0
};
NSArray *accounts = @[acc1, acc2, acc3, acc4];
[accounts writeToFile:@"/Users/Daniel/Desktop/account.plist" atomically:YES];
}
将字典转换成NSdata类型步骤:
将字典转换成字符串类型
*/
NSDictionary *dictContent = @{
@"id" :@"1000001",
@"name":@"Daniel",
@"balance":@12340000.15,
@"loan":@8000000.0
};
//先把字典转换成字符串类型
NSString *dicStr = [dictContent description];
//在把字符串类型转换成NSData
NSData *dicData = [dicStr dataUsingEncoding:NSUTF8StringEncoding];
BOOL isSuccess = [self.manager createFileAtPath:dictionaryPath contents:dicData attributes:nil];
// BOOL isSuccess1 = [dictContent writeToFile:dictionaryPath atomically:YES];
if (isSuccess)
{
NSLog(@"字典写入成功");
}
}
}
从文件中读取数据到数组中
#import "TRAccount.h"
void test2()
{
//从文件中读取数据到数组,此时数组中的每个元素都是一个字典
NSArray *accounts = [NSArray arrayWithContentsOfFile:@"/Users/Daniel/Desktop/account.plist"];
//准备一个数组,用来保存所有的转换后的对象
NSMutableArray *accountObjs = [NSMutableArray new];
//将数组中的每一个字典转换成TRAccount类型的对象
for (NSDictionary *dict in accounts) {
//dict ==> TRAccount
/*
TRAccount *acc = [[TRAccount alloc]initWithId:dict[@"id"] andName:dict[@"name"]];
acc.balance = [dict[@"balance"]doubleValue];
acc.loan = [dict[@"loan"]doubleValue];
*/
TRAccount *acc = [TRAccount accountWithDictionary:dict];
[accountObjs addObject:acc];
}
//遍历对象数组
for (TRAccount *acc in accountObjs) {
NSLog(@"%@", acc);
}
}
使用字典初始化当前对象
- (instancetype)initWithDictionary:(NSDictionary *)dict
{
if (self = [self initWithId:dict[@"id"] andName:dict[@"name"]]) {
_balance = [dict[@"balance"]doubleValue];
_loan = [dict[@"loan"]doubleValue];
}
return self;
}
label
设置大小
label.frame = CGRectMake(50, 50, 250, 200);
设置内容
label.text = @"这是一段测试文字";
设置背景色
label.backgroundColor = [UIColor colorWithRed:120/255.0 green:79/255.0 blue:120/255.0 alpha:1];
设置字体大小
label.font = [UIFont systemFontOfSize:20];
设置字体颜色
label.textColor = [UIColor whiteColor];
设置行数,默认1,0代表无限制
label.numberOfLines = 0;
设置“…”的位置,具体看enum
label.lineBreakMode = NSLineBreakByTruncatingMiddle;
设置文字位置(左对齐,右对齐,居中)
label.textAlignment = NSTextAlignmentCenter;
button
button.frame = CGRectMake(20, 30, 200, 30);
[button setTitle:@“添加标签" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor lightGrayColor]];
为按钮添加点击事件
[button addTarget:self action:@selector(addLabel:) forControlEvents:UIControlEventTouchUpInside];
3.添加到控制器的view中
[self.view addSubview:button];