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];

上一篇:Spring-1-(简介及HelloWord)


下一篇:[ActionScript] AS3 涂鸦的擦除和撤销功能