NSArray和NSMutableArray
ios replaceobjectatindex不生效

ios replaceobjectatindex不生效
如果你在使用 replaceObjectAtIndex: 方法时发现它不生效,可能有以下几个原因:
1.数组未被正确初始化:确保你的数组是已初始化的,不是 nil。
你可以通过 alloc 和 init 方法来初始化数组。
2.索引超出范围:确保你替换的索引在数组的有效范围内。
数组的索引从0开始,如果索引超出范围,程序会抛出异常。
3.未使用setObject:forKey:方法:如果你使用的是NSDictionary,你需要使用 setObject:forKey: 方法来替换值,而不是 replaceObjectAtIndex:。
4.数组不可变:如果你使用的是NSArray的不可变子类(如NSArray),你不能修改它。
你需要使用NSMutableArray 来代替。
5.并发问题:如果你在多线程环境中工作,确保对数组的访问是线程安全的。
你可以使用锁或@synchronized来保护代码块。
6.对象引用问题:确保你替换的是对象的引用,而不是对象本身。
例如,如果你有一个对象A和对象B,即使它们的内容相同,它们也不是同一个对象(即它们的引用不同)。
如果你可以提供更多的代码或上下文信息,我可能能提
供更具体的帮助。
ios可变数组的实现原理

ios可变数组的实现原理iOS可变数组是一种常见的数据结构,是程序开发中非常实用的工具。
那么iOS可变数组的实现原理是什么呢?本文将详细介绍。
1.数组的概念在计算机编程中,数组是一组有序的数据集合。
数组的每个元素可以通过其索引位置访问,索引位置从0开始,表示第一个元素,以此类推。
iOS中的数组有两种类型:NSArray和NSMutableArray。
其中,NSArray是不可变的,而NSMutableArray是可变的。
也就是说,数组一旦被创建,其元素就不能再被添加、删除、替换和移动,而可变数组则允许这些操作。
因此,本文主要介绍可变数组的实现原理。
2.可变数组的底层结构在iOS中,可变数组的底层实现是基于双向链表的数据结构。
在这种结构中,每个元素都有一个前驱指针和一个后继指针,可以快速地进行插入、删除、替换和移动等操作。
具体来说,在可变数组中,每个元素存储在一个Objective-C对象中,这个对象就是其节点。
然后,这些节点通过前驱指针和后继指针进行连接,形成一个动态的双向链表。
同时,可变数组还会维护一些额外的状态信息,如总元素个数、容量大小等。
3.可变数组的操作过程当我们对可变数组进行修改操作时,实际上是在对链表进行增删改操作。
不同的操作会触发不同的逻辑,这里简单介绍一下可变数组的常见操作过程。
(1)添加元素当我们向可变数组中添加元素时,如果已有足够的容量,则直接将元素添加到链表尾部。
如果容量不足,则会先进行扩容操作,然后再添加元素。
(2)删除元素当我们从可变数组中删除元素时,实际上是在链表中找到对应的节点,并将其从链表中剔除。
同时,也会将节点所占用的内存释放掉。
(3)替换元素当我们替换可变数组中的元素时,实际上是在链表中找到对应的节点,并将其替换成新元素。
同时,也会将旧节点所占用的内存释放掉。
(4)移动元素当我们移动可变数组中的元素时,实际上是在链表中找到对应的节点,并将其从原位置删除,然后再添加到新位置中。
O_C基础知识

objective-c基础教程——学习小结提纲:简介与C语言相比要注意的地方objective-c高级特性开发工具介绍(cocoa 工具包的功能,框架,源文件组织;XCode使用介绍)简介:1. objective-c是C语言的一个扩展集,主要由APPLE公司维护,是MAC系统下的主要开发语言。
个人认为,对于用惯了常用的C,JAVA等语言的人来说,objective-c是一中很另类,非主流的语言。
2. 开发Mac的UI 程序来说,使用的是Cocoa 这个框架,cocoa的组成部分有:foundation和application kit框架。
【foundation框架处理用户界面之下的特性,如数据结构和通信机制;application kit框架包含cocoa的高级特性:用户界面元素,打印,颜色,声音管理,applescript等】3. 我通过这本书的学习:基本掌握了Objective C的语法,基本能看懂别人写的代码,自己也能编写代码;熟悉了开发环境XCode的使用;(包括建立项目,调试,运行,代码管理等)与C语言相比要注意的地方:1. 文件介绍:Objective-C 也使用头文件(header files),后缀为 .h, 但使用 .m(即message, 其他面向对象编程语言也叫method),作为源文件的后缀。
在objective-c中使用#import<>,而不使用#include<>,#import可以保证头文件只被包含一次。
2. 与C一致的地方:数据类型,表达式,各种运算符循环:for, while, do while, break, continue分支:if, else, switch3. NSlog()函数:与printf()类似,想控制台输出信息。
但它增加了一些特性,如时间戳等。
【cocoa对起所有的函数,常量和类型名称都添加了NS前缀。
】4. 双引号的前面的@表示这双引号中的字符串应该作为cocoa的NSString元素来处理。
IOS开发之旅-IOS常用数据结构NSArray、NSMutableArray、NSDic。。。

IOS开发之旅-IOS常⽤数据结构NSArray、NSMutableArray、NSDic。
NSArrayNSArray基本⽤法void arrayTest1(){//数组初始化最后必须以nil结尾,表⽰数组元素结束NSArray *array1 = [[NSArray alloc]initWithObjects:@"item0",@"item1",@"item2",@"item3",@"item4",nil];NSLog(@"%@",array1);/*(item1,item2,item3,item4)*///获取数组元素个数NSLog(@"array count : %ld",array1.count);/*array count : 4*///获取特定所以元素NSLog(@"array[1] = %@",array1[1]);/* array[1] = item1 */NSLog(@"array[1] = %@",[array1 objectAtIndex:(NSInteger)1]);/* array[1] = item1 */NSLog(@"firstObject = %@",array1.firstObject); //获取第⼀个元素/* firstObject = item1 */NSLog(@"lastObject = %@",stObject); //获取最后⼀个元素/* lastObject = item4 *///拼接数组NSLog(@"%@",[array1 componentsJoinedByString:@","]);/* item0,item1,item2,item3,item4 *///查找元素的索引,如果包含特定元素,返回具体索引,否则返回:9223372036854775807NSLog(@"%ld",[array1 indexOfObject:@"item11"]);//是否包含特定元素NSLog(@"%i", [array1 containsObject:@"item1"] == TRUE ? 1 : 0);/* 1 */NSArray *subArray = [array1 subarrayWithRange:NSMakeRange(1, 2)];NSLog(@"%@",subArray);/*(item1,item2)*///保存数组元素到本地⽂件,以xml格式序列化存储[array1 writeToFile:@"/Users/new/Desktop/array.txt" atomically:YES];/*<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><array><string>item0</string><string>item1</string><string>item2</string><string>item3</string><string>item4</string></array></plist>*///读取本地⽂件,反序列化为数组NSArray *array2 = [[NSArray alloc]initWithContentsOfFile:@"/Users/new/Desktop/array.txt"];NSLog(@"%@",array2);/*(item0,item1,item2,item3,item4)*///判断数组元素是否相等BOOL result = [array1 isEqualToArray:@[@"item0",@"item1",@"item2"]];NSLog(@"%@",result);/* 0 */NSArray遍历void arrayTest2(){NSArray *array1 = [[NSArray alloc]initWithObjects:@"item0",@"item1",@"item2",@"item3",@"item4",nil]; //遍历⽅法1for (int index = 0; index < array1.count; index++) {NSLog(@"%@",array1[index]);}/*item0item1item2item3item4*///遍历⽅法2for (NSString *item in array1) {NSLog(@"%@",item);}/*item0item1item2item3item4*///遍历⽅法3//NSEnumerator *enumerator = [array1 reverseObjectEnumerator]; //逆向遍历NSEnumerator *enumerator = [array1 objectEnumerator]; //正向遍历NSString *item = nil;while (item = [enumerator nextObject]) {NSLog(@"%@",item);}/*item0item1item2item3item4*///遍历⽅法4[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {NSLog(@"%ld = %@",idx,obj);}];/*0 = item01 = item12 = item23 = item34 = item4*/}NSArray排序void arrayTest3(){//排序⽅法1,普通⽐较器NSArray *array1 = @[@"1",@"21",@"11",@"5",@"51",@"3"];NSArray *array2 = [array1 sortedArrayUsingSelector:@selector(compare:)];NSLog(@"%@",array2);/*(1,11,21,3,5,51)*///排序⽅法2,代码块NSArray *array3 = [array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2];}];NSLog(@"%@",array3);/*(1,11,21,3,51)*///排序⽅法3,⾃定义排序描述符NSArray *originalArray = @[@{@"page_no":@"27",@"age":@24},@{@"page_no":@"1", @"age":@23},@{@"page_no":@"1", @"age":@21},@{@"page_no":@"1", @"age":@25},@{@"page_no":@"1", @"age":@15},@{@"page_no":@"12",@"age":@19},@{@"page_no":@"23",@"age":@29},@{@"page_no":@"3", @"age":@22},@{@"page_no":@"2", @"age":@30},@{@"page_no":@"17",@"age":@33}];NSSortDescriptor *alphaNumSD = [NSSortDescriptor sortDescriptorWithKey:@"page_no" ascending:YES comparator:^NSComparisonResult(NSString *string1, NSString *string2) { return [string1 compare:string2 options:NSNumericSearch];}];NSSortDescriptor *dataNumSD = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES comparator:^NSComparisonResult(id data1, id data2) { return [data1 compare:data2];}];NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[alphaNumSD,dataNumSD]];NSLog(@"%@",sortedArray);/*({age = 15;"page_no" = 1;},{age = 21;"page_no" = 1;},{age = 23;"page_no" = 1;},{age = 25;"page_no" = 1;},{age = 30;"page_no" = 2;},{age = 22;"page_no" = 3;},{age = 19;"page_no" = 12;},{age = 33;"page_no" = 17;},{age = 29;"page_no" = 23;},{age = 24;"page_no" = 27;})*///排序⽅法4,⾃定义⽐较⽅法Person *person1 = [[Person alloc]initWithFirstName:@"hello" lastName:@"world" age:35];Person *person2 = [[Person alloc]initWithFirstName:@"abc" lastName:@"def" age:25];Person *person3 = [[Person alloc]initWithFirstName:@"cal" lastName:@"kdl" age:22];NSArray *personArray = @[person1,person2,person3];NSArray *tempArray = [personArray sortedArrayUsingSelector:@selector(comparePeople:)];NSLog(@"%@",tempArray);/*(" firstName: abc,lastName:def,age:25"," firstName: cal,lastName:kdl,age:22"," firstName: hello,lastName:world,age:35")*/}NSMutableArray NSMutableArray继承NSArray,所以NSArray的所有特性NSMutableArray都有,在此基础上,NSMutableArray主要新增了添加、删除、更新、插⼊等特性,如下代码演⽰:void arrrayTest4(){NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithObjects:@"item0",@"item1",@"item2",@"item3",@"item4", nil];NSLog(@"%@",mutableArray);/*(item0,item1,item2,item3,item4)*///添加元素[mutableArray addObject:@"item5"];NSLog(@"%@",mutableArray);/*(item0,item1,item2,item3,item4,item5)*///插⼊元素[mutableArray insertObject:@"inserted item" atIndex:(NSInteger)1];NSLog(@"%@",mutableArray);/*(item0,"inserted item",item1,item2,item3,item4,item5)*///删除元素[mutableArray removeObject:@"item5"];NSLog(@"%@",mutableArray);/*(item0,item1,item2,item3,item4)*///更新元素[mutableArray replaceObjectAtIndex:(NSInteger)5 withObject:@"replacedItem"];NSLog(@"%@",mutableArray);/*(item0,"inserted item",item1,item2,item3,replacedItem)*///删除所有元素[mutableArray removeAllObjects];NSLog(@"%ld",mutableArray.count);/* 0 */}NSDictionary字典初始化void arrayTest5(){//字典初始化⽅式1NSDictionary *dictionary1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1",@"value2",@"key2",@"value3",@"key3",@"value4",@"key4",nil];NSLog(@"%@",dictionary1);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*///字典初始化⽅式2NSArray *valueArray = @[@"value0",@"value1",@"value2",@"value3",@"value4"];NSArray *keyArray = @[@"key0",@"key1",@"key2",@"key3",@"key4"];NSDictionary *dictionary2 = [[NSDictionary alloc]initWithObjects:valueArray forKeys:keyArray];NSLog(@"%@",dictionary2);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*///字典初始化⽅式3NSDictionary *dictionary3 = @{@"key0":@"value0",@"key1":@"value1",@"key2":@"value2",@"key3":@"value3",@"key4":@"value4"};NSLog(@"%@",dictionary3);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*///调⽤NSDictionary静态⽅法⽣成字典NSDictionary *dictionary4 = [NSDictionary dictionaryWithObject:@"value0" forKey:@"key0"];NSLog(@"%@",dictionary4);/*{key0 = value0;}*/NSDictionary *dictionary5 = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];NSLog(@"%@",dictionary5);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*/NSDictionary *dictionary6 = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1",@"value2",@"key2",@"value3",@"key3",@"value4",@"key4", nil]; NSLog(@"%@",dictionary6);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*/}字典基本常⽤⽤法void arrayTest6(){NSDictionary *dictionary1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1",@"value2",@"key2",@"value3",@"key3",@"value4",@"key4",@"value4",@"key5",nil];NSLog(@"%@",dictionary1);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value4}*/NSLog(@"%ld",dictionary1.count);/* 5 *///输出特定元素NSLog(@"%@",dictionary1[@"key0"]);NSLog(@"%@",[dictionary1 objectForKey:@"key0"]);/* value0 *///获取所有keyNSLog(@"%@",dictionary1.allKeys);/*(key3,key1,key4,key2,key0)*///获取所有valueNSLog(@"%@",dictionary1.allValues);/*(value3,value1,value4,value2,value0)*///获取特定value对应的所有keyNSLog(@"%@",[dictionary1 allKeysForObject:@"value4"]);/*(key4,key5)*///分别获取key对应的value,对于不存在的key,返回"not found"NSLog(@"%@",[dictionary1 objectsForKeys:@[@"key0",@"key1",@"key8"] notFoundMarker:@"not found"]); /*(value0,value1,"not found")*/NSDictionary *dictionaryOther = @{@"key0":@"value0"};BOOL result = [dictionary1 isEqualToDictionary:dictionaryOther];NSLog(@"%hhd",result);/* 0 *///保存到本地⽂件[dictionary1 writeToFile:@"/Users/new/Desktop/dictionary.txt" atomically:YES];/*<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"><dict><key>key0</key><string>value0</string><key>key1</key><string>value1</string><string>value2</string><key>key3</key><string>value3</string><key>key4</key><string>value4</string><key>key5</key><string>value4</string></dict></plist>*///读取本地⽂件,反序列化为字典NSDictionary* dictionary2 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/new/Desktop/dictionary.txt"]; NSLog(@"%@",dictionary2);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value4;}*///修改字典元素值,如果key存在,则修改对应的value,如果key不存在,则插⼊⼀个新元素[dictionary2 setValue:@"update value0" forKey:@"key0"];NSLog(@"%@",dictionary2);/*{key0 = "update value0";key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value4;}*///插⼊⼀个新元素,该key不存在[dictionary2 setValue:@"key not found" forKey:@"noKey"];NSLog(@"%@",dictionary2);/*{key0 = "update value0";key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value4;noKey = "key not found";}*/}NSDictionary遍历void dictionaryTest(){NSDictionary *dictionary1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1",@"value2",@"key2",@"value3",@"key3",@"value4",@"key4",@"value4",@"key5",nil];//遍历⽅法⼀for (NSString *key in dictionary1) {NSLog(@"%@ = %@",key,dictionary1[key]);}/*key3 = value3key1 = value1key4 = value4key2 = value2key0 = value0key5 = value5*///遍历⽅法⼆//NSEnumerator *objectEnumerator = [dictionary1 objectEnumerator]; //objectEnumerator获取value枚举NSEnumerator *keyEumerator = [dictionary1 keyEnumerator]; //keyEnumerator获取key枚举NSString *key = nil;while (key = [keyEumerator nextObject]) {NSLog(@"%@ = %@",key,dictionary1[key]);}/*key3 = value3key1 = value1key4 = value4key0 = value0key5 = value5*///遍历⽅法三[dictionary1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {NSLog(@"%@ = %@",key,obj);}];/*key3 = value3key1 = value1key4 = value4key2 = value2key0 = value0key5 = value5*/}NSMutableDictionaryNSMutableDictionary继承于NSDictionary,在此基础上新增加对元素新增、删除、更新等操作,如下代码演⽰void mutableDictionaryTest(){NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc]initWithCapacity:7];NSLog(@"%ld",mutableDictionary.count);/* 0 */[mutableDictionary setValue:@"value0" forKey:@"key0"];[mutableDictionary setValue:@"value1" forKey:@"key1"];[mutableDictionary setValue:@"value2" forKey:@"key2"];[mutableDictionary setValue:@"value3" forKey:@"key3"];[mutableDictionary setValue:@"value4" forKey:@"key4"];[mutableDictionary setValue:@"value5" forKey:@"key5"];[mutableDictionary setValue:@"value6" forKey:@"key6"];[mutableDictionary setValue:@"value7" forKey:@"key7"];NSLog(@"%ld",mutableDictionary.count);/* 8 */NSLog(@"%@",mutableDictionary);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value5;key6 = value6;key7 = value7;key8 = value8;}*///删除元素[mutableDictionary removeObjectForKey:@"key7"];NSLog(@"%ld",mutableDictionary.count);/* 7 */NSLog(@"%@",mutableDictionary);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;key5 = value5;key6 = value6;}*///对于key存在,则修改对应的value,否则添加新元素[mutableDictionary setValue:@"update value6" forKey:@"key6"];NSLog(@"%@",mutableDictionary);//移除多个key对应的元素[mutableDictionary removeObjectsForKeys:@[@"key6",@"key5"]];NSLog(@"%@",mutableDictionary);/*{key0 = value0;key1 = value1;key2 = value2;key3 = value3;key4 = value4;}*///移除所有元素[mutableDictionary removeAllObjects];NSLog(@"%ld",mutableDictionary.count);/* 0 */} 以上代码在开发过程中⽐较常⽤,如果有不⾜之处,请给我留⾔。
IOS开发之NSMutableArray与NSArray的区别

IOS开发之NSMutableArray与NSArray的区别IOS 开发之 NSMutableArray与NSArray 的区别⾸先,来看下2者的区别:NSArray and its subclass NSMutableArray manage collections of objects called arrays.NSArray creates static arrays, and NSMutableArray creates dynamic arrays.NSMutableArray是NSArray的⼦类,NSArray建⽴静态数组,⽽NSMutableArray则是动态数组.换句话说,NSArray建⽴之后不可修改,⽽NSMutableArray则可以修改.由于在ObjC中,简单的看下函数addObject,会发现数组的元素是id类型,也就是说是指针.-(void)addObject:(id)anObject如此⼀来数组⾥就不能压⼊NSUInteger,BOOL之类的⾮指针型数据了,要命吧..那要压⼊这些内容怎么办呢?对,类型转换,ObjC提供了NSNumber来给⼤家转换⽤,NSNumber本⾝是个指针类型变量. Inherits from NSValue : NSObject来个简单的转换例⼦:NSUIntegercount = 1;NSNumber*j = [NSNumber numberWithInt:count];[aryaddObject:j];还算明了吧,就是⽤到这个值的时候⼜要转换⼀次,...昨天刚好⼜⽤到数组的乱序,在⽹上找了个Sample修改了下,代码如下:#pragmamark -#pragmamark (NSMutableArray *)randArray:(NSMutableArray *)ary-(NSMutableArray *)randArray:(NSMutableArray *)ary{NSMutableArray*tmpAry = [NSMutableArray arrayWithArray:ary];NSUIntegercount = [ary count];for(NSUInteger i = 0; i < count; ++i) {intnElements = count - i;//Seed the random number generatorsrandom(time(NULL));intn = (random() % nElements) + i;[tmpAryexchangeObjectAtIndex:i withObjectAtIndex:n];}returntmpAry;}如有疑问请留⾔或者到本站社区交流讨论,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
Xcode常用基础代码指令

容易遗忘的代码: &&是且||是或1.建立一个部件UILable*名字=[[UILable alloc] init];纯文字[self.window addSubview:名字];UIImageView是图像的名称UITextField是文本框或输入框UIbutton是按钮UIview 视图层次的切换2.基础代码有:名字.text=@“输入文字”对象.farme=CGRectMake(10,10,20,40)UIColor*名字=[UIColor 颜色(redColor)]名字.backgroundColor=上述名字(背景颜色)名字.textColor=上述名字(文字颜色)名字.font=[UIFont systemFontOFSize:数字](字体大小)名字.textAlignment=NSTextAlignmentCenter(居中对齐)名字.lineBreakMode=NSLineBreakByTruncatingMiddle(行中断是.......) 名字.numberOfLines=数字(设置默认行数0为无限)添加图片:名字.image=[UIImage imageNamed:@“图片名称”]添加输入框:名字.borderStyle=UITextBorderStyleRoundedRect(设置输入框格式)名字.placeholder=@“内容”(输入内容)名字.clearButtonMode=UITextFieldViewModeAlways(聊天框清除按钮)名字.secureTextEntry=YES(安全输入)名字.returnKeyType=UIReturnKeyGo(返回键类型)名字.keyboardType=UIKeyboardTypeNumberPad(设置键盘类型)弹回按键-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{[self.window endEditing:YES]}是让按键弹回去UIbutton 这是设置按钮选项[名字settitle:@“按钮的名字” forstate: 按钮类型][名字settitlecolor:……forstate ]设置按钮的颜色和类型名字.tielelabel.font设置字号大小给⃣按⃣钮⃣设置方法[名字 addtarget:self action:@selector(方法名) forcontrolevents:最好选UIControlEventTouchUpInside][button setbackgroundimage: image for state:UI….];把图片给按钮清楚桌布用的是-(void)方法名{[全局变量(就是名字) removeFromSuperview]}—————————————————————————————————名字.clipstobounds=yes 是否剪切名字.layer.cornerradius=数字半径超出多少以外都剪掉.int number=arc4random()%范围;这个是随机一个范围内的数将字符串转化为int型int 名字=[名intvalue]nsstring*元素=[nsstring stringwithformat:@“%f/d”,最终的函数]将int或float型转成字符型selected这个状态能使用button.selected=YESa.tag=1;a.tag=2;[self.window exchangesubviewatindex:数序withsubviewatindex数序]他俩相互换位置第一种交换方式[self.window bringsubviewtofront:名字]第二种将所用方法调到最前面[self.window sendsubviewtoback:名字]第三种将所用方法调到最后面判断两个字符串是否相等if([名字1 isequaltostring :名字2]){}int 函数=[名字.text length];int 函数2=[名字.text length];if (函数<3||函数2<4){nslog(@“用户名’太短);return;}UIview动画;开启动画[UIview beginanimations:nil context:nil];设置动画时间[UIview setanimationduration:3];可以使动画停止时调用另一个方法[UIview setanimationdelegate:self][UIview setanimationdidstopselector:@selector(方法名)];动画重复次数:[UIview setanimationrepeatcount:1];动画的无限循环(MAXFloat) 在这可以修改view的位置[UIview setanimationrepeatautoreverses:yes/no]动画是否往返运动动画的匀速速率[UIview setanimationcurve:UIviewanimationcurvelinear]提交动画[UIview commitanimations]将一个类或者对象的地址输出nslog(@“名字=%@”,self);如果在一个类里面使用self那么这个self被谁调用就是谁.@property(nonatomic,assign)int 方法名(函数名);隐藏方法就是不声明直接在m文件中编程然后在被声明的本类文件调用init的应用-(id)init;-(id)initWith名字:(类型int)名with名字:(类型比如nsstring*)名在其方法内self=[super init]if(self){ 名字=什么什么的}或self=[super initwith名字:名 with名字:名]给label直接给位置UIlabel*label=[[UIlabel alloc]initwithframe:cgrectmake(x,y,xx,yy)];用加号方法给按钮定义UIbutton*button=[UIbutton buttonwithtype:UIbuttontypecustom];size尺寸cgsize 名字=[string sizewithfont:[UIFont systemFontOfSize:字号]]; nslog(@“size.height=%f,size.width=%f”,size.width,size.height);视图控制器创建视图控制器是UIviewcontroller在主界面使用类最后是self.window.rootviewcontroller=名字-(void)viewdidload是当视图加载完调用他之下的程序-(void)didreceivememorywarning内存警告方法self.view.系统方法直接调用系统方法获取window的方法类名*名字=[[zhuce alloc]init];UIwindow*window=[[[UIapplication sharedapplication]delegate]window];window.rootviewcontroller=名字;viewwillappear是视图将要出现viewdidappear是视图已经出现viewwilldisappear是视图将要消失viewdiddisappear是视图已经消失__weak IBOutlet 方法名 * 名字IBaction控制事件的关键字自己新建一个XIB需要自己做时,名字相同就如上述,不同就加initwithnibname:@“名字” bundle:nil,把xib告诉程序设置翻转界面[UIview setanimationtransition:UIviewanimationtransitionflipfromleft for view:winwindow cache:yes];将story加到视图控制器上UIstoryboard*story=[UIstoryboard storyboardwithname:@“Main” bundle:nil ]; 你的要显示的第一个界面类名*名字=[story instantiateinitialviewcontroller]; 延迟执行一个方法的方法[self performselector:@selector (方法名) with object:nil after delay:时间]; 定时器全局变量=[nstimer scheduledtimewithtimeinterval:时间 target: self selector: @selector(方法名) userinfo:nil repeats:yes];关闭定时器[_time invalidate][_time setfiredate:[nsdate distantfuture]]开启定时器[_time setfiredate:[nsdate distantpast]];static是循环运行一次之后就不再运行的[button setbackgroundimage: image for state:UI….];把图片给按钮nsstring*名字=[nsstring stringwithfarmat:”@string”];透明度是名字.alpha=0~1-(void)animationdidstop:(nsstring*)animationid finished:(nsnumber*)finished context:(void*)context动画停止的绑定方法.[UIview begin animations:nil context:(__bridge void*)(名字)];设一个对象UIimageview*名字=(__bridge UIimageview*)(context);调用之后的指向对象数组:nsarray是不可变数组nsmutablearray是可变数组一共有6种表现方式:1.…=[[nsarray alloc]initwithobjects:@“321”,nil];2.…=[nsarray arraywithobejcts:@“111”,nil];3. …=[[nsmutablearray alloc]init];4. …=[[nsmutablearray alloc]initwithobjects:@“123”,nil]5. …=[[nsmutablearray alloc]initwithcapacity:多少个];6. …=[nsmutablearray array];除了不可变是开始赋值,可变可以在开始或者过程中赋值查询数组中元素的个数[数组名 count];用索引号查询数组的某个元素[数组名 objectatindex:序列号];#warning 是警告可以在之后写警告可以用for循环给数组赋值或者取出数组forin遍历 for(nsstring*变量名 in 数组名)单独往数组内增加元素[数组名 addobject:@“什么”];删除可变数组中的全部元素[array removeallobjects]删除一个叫什么什么的元素[array removeobject:@“…”];根据索引号去删除相对应的元素[array removeobjectatindex:数字];移除数组中的最后一个元素[array removelastobject];替换一个元素[array replaceobjectatdex:数字 withobject:@“什么”];根据索引号去插入一个元素[array insertobject:@“什么” atindex:1];根据索引号交换两个对应对象的位置[array exchangobjectatindex:数字withepbjectatindex:数字];#define 变量数字; 宏定义相当于全局变量origin 起始点的坐标自定义初始化方法:-(id)initWithFrameY:(CGRect)frame text:(NSString*)text记得return self; 还要self=[super init];if(self)系统提供的绘图方法-(void)drawrect:(CCGRect)rect{ [super drawrect:rect] }帧动画:桢动画的时间一个imageview类型的名称.animationduration=数字重复次数名称.animationrepeatcount=数字设置来源名称.animationImages=array开启帧动画[名称 startanimating];停止桢动画[名称 stopanimating];当数组里面有按钮是可以将按钮的方法设置为-(void)按钮方法:(UIbotton*)变量{ [变量] }的方式使用按钮来区分不同的button对象UIButton *btu = (UIButton*)[视图名 viewWithTag:[数组名 objectAtIndex:i]];可以这样获取button在方法里可以UIbutton *button = [self.view viewWithTag:(传进来的button.tag)]九宫格按钮:先计算按钮的行间距和列间距第一种是套两个for循环:for(int j=0;j<数字;j++){for(int i=0;i<shuzi;i++){最好是行在里列在外这样才是横着输出}}第二种是1个for循环for(int a=数字;a<数字;a++){a是你要的控件个数a%行数是对行取余确定行号 a/列数是取列数}动画效果:确定一个中心位置对象.center=cgpointmake(数字.数字);self.view.center.x 和self.view.center.y是整个视图界面的中心点对象.bounds=cgrectmack(0,0,坐标,坐标);是对象自己的大小switch(button.tag)用作判断语句case 数字: { } break;可以用tag值做判断执行[self begainanimationwithtag:数字];当按钮的tag值是几就会执行第几个事情最后default:break; 关闭[self.对象isaniamting];判断动画是不是还在执行加if语句如果动画在做则进入if语句return是跳出当前的方法体break是跳出循环或判断,也就是跳出当前语句做圆周运动的设置:角度是float型的一个对象当角度不断增加计算弧度float 弧度=对象角度*M_PI/180;M_PI是π的意思x和y也就是通过起始位置+半径*cos(弧度)或起始位置+半径*sin(弧度);在把对象中心放到对象.center=cgpointmake(x,y);通过建一个类来创建一个相当于tag的保存数据的属性然后通过forin输出将所有需要的动画一同变一下数据类型转换:1.nsstring*对象=[nsstring stringwithformat:@“”,对象];int 对象=[对象 intvalue]float 对象=[对象 floatvalue]2nsnumber型的数据转化nsnumber*对象=[nsnumber numberwithint/float :对象];取出对象如上结构体的转化nsvalue*对象=[nsvalue valuewithcgpoint/cgrect: 对象]取出如上结构体的输出可以两种一种是对象.x,对象.origin.x的输出另一种是nsstringfromcgpoint(对象);线程:分线程的创建nsthread*对象=[[nsthread alloc]initwithtarget:self selector:@selector(方法名) object:nil];使用上述线程需要开启线程[thread start ]加法方法创建线程:[nsthread detachnewthreadselector:@selector(方法名) to target:self withobject:nil];加法方法不需要手动开启判断线程是否是主线程有两种1.[ns thread currentthread]如果是主线程num值是1不是1就是分线程2.[nsthread ismainthread];如果是主线程就是yes 1 不是就是0/no从分线程回到主线程的方法[self performselectoronmainthread:@selector(方法名) witheobject:nil waituntildone:yes/no];是否让分线程等待no是不让也就是主和分同时进行yes则是等主线程方法执行完之后在执行分线程[nsthread sleepfortimeinterval:时间]让线程休眠的时间导航控制器:创建一个导航控制器最初的界面firstviewcontroller*父类的子类所创建的对象=[[firstviewcontrolleralloc]init];UINavigationController*对象=[[UINavigationControlleralloc]initWithRootViewController:以UIcontroller为父类的子类所创建的对象]; self.window.rootviewcontroller=对象;设置导航栏隐藏默认是不隐藏的对象.navigationbarhidden=yes表示隐藏设置工具条不隐藏默认是隐藏的对象.toolbarhidden=no;设置导航条的标题内容self.title=@“123”;self.navigationitem.title=@“123”;设置导航条的背景颜色[self.navigationcontroller.navigationbar setbartintcolor:[UIcolor 颜色]];修改导航栏的透明度默认是0.5半透明可以设置为不透明[self.navigationcontroller.navigationbar settransucent:no];修改导航条标题内容比如字符大小或者字体颜色[self.navigationcontroller.navigationbarsettitletextattributes:@{nsfontattributename:[UIfont systemfontofsize:字号],nsforegroundcolorattributename:[UIcolor bluecolor] }];往工具条上放按钮UIbarbuttonitem*对象=[[UIbarbuttonitem alloc]initwithbarbuttonsystemitem:选择一个按钮的类型 target:self action:@selector(方法名)];把创建的按钮放到工具栏上self.toolbaritems=[nsarry arraywithobjects:对象,nil];把创建号的按钮放到导航栏self.navigationitem.leftbarbuttonitem=对象self.navigationitem.leftbarbuttonitems=[nsarray arraywithobjects:对象1,对象2,nil];点击按钮切换到第二个界面将第二个界面入栈第二个类*对象=[[第二个类alloc]init];[self.navigationcontroller pushviewcontroller:对象animated:yes];出栈的操作[self.navigationcontroller popviewcontrolleranimated:yes];pop有三种出栈方式这一种是自动返回上一个界面还有两种分别是回到栈底元素和回到你指定的元素.自定义返回按钮的名称UIbarbuttonitem*对象=[[UIbarbuttonitemalloc]initwithtitle:@“返回名”style:uibarbuttonitemstyleplain target :self action:nil];定义为下一个界面的返回按钮self.navigationitem.backbarbuttonitem=对象back是作为下一个界面的返回按钮self.navigationitem.leftbarbuttonitem=对象这个按钮会把系统的返回按钮隐藏想要直接返回第几页就去找导航控制器的数组的第几位随便一个类*对象=[self.navigationcontroller.viewcontrollers objectatindex:数字];数字是第几页-1[self.navigationcontroller poptoviewcontroller:对象animated:yes];传值需要在始终加载的viewwillappear:(bool)animated上编写传的值self.第一个界面的输入框.text=self.全局变量第二个输入的property警示框UIalertview*对象=[[UIalertview alloc]initwithtitle:@“警示框标题” message:@“提示内容” delegate:nil cancelbuttontitle:@“取消按钮” otherbuttontitles:@“第一个按钮”,@“第二个按钮”,@“第三个”,nil];[对象 view]展示警示框创建自定义警示框需要先创建一个自定义的警示框的类,继承于警示框的类然后在此类里面设计一个警告框的方法id形式,要记得把tag值全局过去,也要接受一个本界面的对象 viewcontroller *对象-(id)initwithtitle:(nsstring*)title withmessage:(nsstring *)message cancelbuttontitle:(nsstring*)cancelbuttontitleotherbuttontitle:(nsstring*)otherbuttontitle;其中添加各种self=[super init]; if(self){self.frame=… UIview*对象…. 要将需要的对象加到view上}再定义一个显示出来的界面UIwindow*window=[[[UIapplication sharedapplication]delegate]window][window addsubview:self];协议:是在你需要的类的声明里编写协议方法在你的@interface后面写<customalertviewdelegate>可获得他的方法名提示可以在.m文件中调用该方法在第二个或其他类中告诉编译器存在这样一个协议@protocol customalertviewdelegate 在@interface之前写@property (nonatomic,assign)id <custom alertviewdelegate>delegate@protocol customalertviewdelegate <nsobject>这是声明一个协议的开始@optional表示可以实现也可以不实现@required是必须实现表示展示控件是必须的之后在下面加入方法-(void)clickedbuttonatindex:(int)tag在需要使用协议的.m中实现方法既可.滚动视图UIscrollview*对象=[[UIscrollview alloc]initwithframe:cgrectmake(0,0,0,0)]创建并初始化位置对象.contentsize=cgsizemake(4*320,200) 4是指4个视图设置水平指示条是否显示或垂直指示条是否显示对象.showshorizontalscrollindicator/showsverticalscrollindicator=no设置是否进行分页显示对象.pagingenabled=yes设置是否显示弹性效果对象.bounces=no设置内容的偏移量对象.contentoffset=cgpointmake(偏移数)x为负就往右x为正就往左 y为正往上负为下使动画做运动[对象setcontentoffset:cgpointmake(变量*320,0) animated:yes];修改颜色的方法对象.backgroundcolor=[UIcolor colorwithred:你要的数/255.0 green:同上blue:同上alpha:透明度];创建分页控制器对象UIpagecontrol*对象=[[UIpagecontrol alloc]initwithframe:cgrectmake()]设置小圆点的个数对象.namberofpages=数字;设置所有小圆点的颜色对象.pageindicatortintcolor=[UIcolor blackcolor]设置当前位置小圆点的颜色对象.currentpageindicatortintcolor=[UIcolco …]设置他当前的位置第一个位置对象.currentpage=2 默认是0 也就是第一个位置给该控件绑定事件[对象addtarget:self action:@selector(方法名) forcontrolexents:UUIcontrolexentvaluechanged];对象.backgroundcolor=[UIcolor 颜色]; [self.view addsubview:page];-(void)方法名当小圆点改变位置时会调用该方法当用户将要拖拽的时候-(void)scrollviewwillbegindragging:(UIscrollview*)scrollview{} 让定时器停止然后清0 dragging拖拽当用户停止拖拽的时候-(void)scrollviewdidenddragging:(UIscrollview*)scrollview willdecelerate:(bool)decelerat{}将要开始减速时调用-(void)scrollviewwillbegindecelerating:(UIscrollview*)scrollview{} 停止减速时调用-(void)scrollviewdidenddecelerating:(UIscrollview*)scrollview{}在拖动结束时修改位置的值=对象.view.contentoffset.x/320;再加入定时器在做一些按钮和视图进行判断的时候可以将按钮和图片变成子类,再往上添加子类的属性 ,来用于增加判断的条件三木运算符float y=a<5?300:360 a<5判断条件 ?代表的是是否成立成立则是360否则是300#pragma mark—文字是提示你创建的功能在哪里通过给控件tag值来找到控件类*对象=(类*)[self.view viewwithtag:tag值];加载网页系统网页的一个类UIwe b view*对象=[UIwebview alloc]init];首先要找你要加载网页的地址 NSURL*对象=[[NSURL alloc]initwithstring@“”];根据给定的域名去创建一个请求NSURLRequest*对象=[[NSURLRequest alloc]initwithURL:网页网址对象];去加载你所创建的请求[webview loadrequest:请求的对象];[self.view addsubview:webview];消息循环:主要是不停的监听和执行消息被加入到消息循环中的时间[NSrunloop currentrunloop]addtimer:timer formode:nsrunloopcommonmodes;创建定时器的时候把定时器默认加到消息循环中;默认是nsdefaultrunloopmode, 当你拖动定时器所在视图的时候会暂时把定时器关闭在关闭时,其实是把消息循环模式更改为UItrackingrunloopmode我们手动把定时器添加到消息循环中并设置为通用模式nsdefaultrunloopmode如果想把超过自身视图的动画裁剪掉需要设置: 那个视图view.clipstobounds=yes;判断一个类型的对象是不是数组中的数for (nsobject *名in array(数组) ){ if(对象isequal:名){ 判断是不是属于这个数组的是就进入判断} }将uiview建一个新的类作为新展示图片或者界面的框图,在其中使用数组建立图片租,然后给其一个接口用来接受数字,然后通过数字改变图片来实现改变view的样式界面切换的第三种方式:模态弹出和模态消失:先建一个视图控制器界面然后建立对象使用[self presentviewcontroller:对象animated:yes completion:nil]; 第三个completion是在界面弹出完成后你想做的其他事情可以写在该代码块让当前视图控制器消失[self dismissviewcontrolleranimated:yes completion:nil];动画方式:[UIview animatewithduration:时间秒 animations:^{代码块} 可以在这里添加代码comletion:^{ 代码} ];其中可以嵌套代码继续做动画的方式选择器:UIpickerview首先可以建立选择器UIpickerview*对象=[UIpickerview alloc]init]; 添加到view上声明代理对象.delegate=self;和对象.datasource=self; 在声明中<UIpickerviewdelegate,UIpickerviewdatasource>datasource主要是用来展示数据的components指的是picker view这个选择器中的列的个数是从零开始的要创建列就要使用方法-(nsinteger)numberofcomponentsinpickerview:(UIpickerview*)pickerview{ return 数字}数字就是其中创建列的个数设置每一列的行数有两种方式一种使用判断语句一种使用大数组套小数组的形式-(nsinteger)pickerview:(UIpickerview*)pickerview numberofrowsincomponent:(nsinteger)component第一种是{if(component==0){return 数字几个}......} 其中用if判断else if结尾的话最后要加一句return nil 或者用else结尾就不用加.第二种是用数组的方式来刷新列你可以将几个小数组放到一个大数组里面去但是要注意要和你的设置相搭配判断行数就是第一列就是你索要的第一个数组第二列开始需要获取大数组中的小数组你就需要建立int selectedrow=[pickerview selectedrowincomponent:第几列];nsarray*array=[大数组objectatindex:selectedrow]; return array.count;可以合并为return [大数组 objectatindex:[pickerview selectedrowincomponent:配合第几列]].count 一般是零外观设置宽度-(cgfloat)picker view:(UIpickerview*)picker view widthforcomponent:(nsinteger)component; {if(component==0){return 数字几个}......} 设置宽度设置高度-(cgfloat)picker view:(UIpickerview*)picker viewrowheightforcomponent:(nsinteger)component; {return 数字几个} 设置高度,高度都是一样的所以就不用分开设置了设置标题首先需要设置数组用数组来赋值-(nsstring*)picker view:(UIpickerview*)pickpickerview titleforrow:(nsinteger)row forcomponent:(nsinteger)component;第一种:{if(component==0){ nsstring*str=[数组objectatindex:row];return str;}……}可以合写为{if(component==0){ return [数组objectatindex:row]}……}第二种数组方式: 第一列还是第一个数组的int selectedrow=[pickerview selectedrowincomponent:第几列];nsarray*array=[大数组objectatindex:selectedrow]; nsstring*str=[array objectatindex:row];return str;合写为:return [[大数组objectatindex:[pickerview selectedrowincomponent:配合第几列]] objectatindex:row]; 一般是零刷新行和列if (component==0){return 第一列的数组.count};第一列的数组有几行需要知道你所选择的是第几行需要用到 int selectedrow=[pickerview selectedrowincomponent:第几列];if(selectedrow==0)就是第0行{return 数组.count}刷新方法:-(void)picker view:(UIpickerview*)picker viewdi'ddidselectrow:(nsinteger)row incomponent:(nsinteger)component{}这里是刷新picker view的方法if(component==0){[pickerview reloadcomponent:1]} 判断第几列的数据动时候,刷新第几列固定显示第几列的第几个[pickerview select row:0 in component:1 animated:yes];刷新所有列[pickerview reloadallcomponents];字典:nsdictionary*对象=[[nsdictionary alloc]initwithobjectsandkeys:@“..”,nil];nsdictionary*对象=[nsdictionary dictionarywithobjectsandkeys:@“…”,nil];查询字典中键值对的数量int 变量=对象.count;查询字典中所有的键nsarray*数组=对象.allkeys;查询字典中所有的值nsarray*数组=对象.allvalues;用for循环取出值的方法for(int a=0;a<对象.count;a++){nsstring*变量=[对象objectforkey:[数组objectatindex:a]];}根据某个键获取该键对应的值nsstring*变量=[对象objectforkey:@“键”];可变字典:nsmutabledictionary*对象=[[nsmutabledictionaryalloc]initwithobjectsandkeys:@“..”,nil];nsmutabledictionary*对象=[nsmutabledictionary dictionary];增加操作[对象setvalue:@“值” forkey:@“键”];重复增加操作而且键一样的情况下指的就是覆盖之前的值移除指定的键所对应的对象[对象removeobjectforkey:@“键”];移除所有的对象[对象removeallobjects];隐藏UIview的对象对象.hidden=yes; 默认是不隐藏是no创建一个日期选择器:UIdatepicker*对象=[[UIdatepicker alloc]init];设置日期选择器的模式对象.datepickermode=UIdatepickermodedateandtime;也可以只有日期没有时间给选择器绑定方法 [对象 addtarget:self action:@selector(方法名) forconrtolevents:UIcontroleventvaluechanged];这里的模式是只要日期选择器发生改变就会调用该方法.设置时间选择器可以展示的最大或者最小的时间nsdate*对象=[nsdate date] 获取当前的时间对象.maximumdate=当前时间的对象对象.minimumdate=当前时间的对象;设置从现在开始过了多少秒之后的时间对象.date=[nsdate datewithtimeintervalsincenow:秒];还有三种是:从1970年到现在过了多久的时间从2001年开始过了多久的时间从哪一个时间点开始过了多长的时间显示日期并日期格式化器nsdate*对象=[datepicker date];获取当前时间nsdateformatter*对象=[[nsdateformatter alloc]init];[对象 serfateformat:@“yyyy—MM—dd HH(hh):mm:ss MMMM eeee a”];代表的意思是年月日24小时制(12小时制)小时分钟秒月份星期几上下午修改上下午的标志[对象setAMSymbol:@“上午”]; [对象setPMSymbol:@“下午”];设置星期几的表示[对象setweekdaySymbols:数组] 按照周日到周六的顺序来设置月份的表示[对象setmonthsymbols:数组];把当前日期转化为字符串[对象stringfromdate:当前时间的对象([datepicker date])];对象的内存管理:automatic reference counting arc 自动管理内存机制先关闭arc然后手动管理内存一个类*对象=[[类名alloc]init];对象.returncount 输出1就代表引用计数是1手动添加一个对象的引用计数的方式是[对象retain];手动减少一个对象的引用计数的方式是[对象release]当这个对象的引用计数已经是1 的情况下当他的引用计数变为0我们是无法在方法中获知的但是他是被释放了的释放实在分线程中实现的主线程和分线程可能进行执行是同步的当对象被释放是会执行一个方法-(void)dealloc {[super dealloc]}当对象被释放时在调用他的本类的方法就会蹦,所以在释放完对象之后就不要再对对象进行调用操作使用alloc,new,retain,copy等关键字的时候,会使对象的引用计数加一,release的操作会使引用计数减一局部变量在使用完成后(调方法,调属性灯)再去release进行释放全局变量如果要释放最好是在本类的dealloc中被释放对象加入数组,对象的引用计数会加1但是不需要我们去release,数组在release的时候会自动对数组内的对象进行release在使用addsub’iew添加子试图的时候子试图的引用计数也会被加1 也不需要我们手动release 当view消失的时候,子试图会自动release内存管理原则是:谁alloc 谁释放,谁retain 谁释放剩下的谁加一谁就减一内存管理导航控制器:导航控制器内引用计数加了6次当导航控制器push的时候加在pop的时候会被减内部有一个alloc的自动release的功能 [对象 autorelease] 自动释放池set方法中-(void)set对象:(类*)变量{if(全局对象(或者propty)!=变量)判断内存地址是否一致{[全局对象 release] [变量 retain] 全局对象=变量}}在dealloc中为了防止野指针一般都需要 [全局对象 release] 全局对象=nil也可以直接self.全局对象=nil;内存分为1.栈区(指针)2.堆区(程序员管)3.全局区(指针)4.常量区(常量字符串)可变字符串[nsmutablestring*对象]=[[nsmutablestring alloc]initwithformat:@“…”].当时用format时所使用的时候引用计数会是1普通字符串是-1使用copy描述时引用计数都是1使用retain描述时引用计数都加1retain保存的属性当原有属性改变时, 他保存的属性也会被改变所以我们一般是用copy属性进行保存创建表视图控件:UItableview*table=[[UItableview alloc]init]需要两个代理table.datasource=self;table.delegate=self;section表示的是区row是行设置每一个区中的行数如果不设置默认为一个区-(nsinteger)tableview:(UItableview*)tableviewnumberofrowsinsection:(NSInteger)section{ return 一个区几行 };设置几个区-(nsinteger)numberOfSectionsIntableView:(UItableview*)tableview{ return 几个区};默认是一个设置单元格内容-(UITableviewcell*)tableview:(UITableview*)tableview cellforrowatindexpath:(nsindexpath*)indexpath{ 建立单元格UItableviewcell*对象=[[UITablviewcell alloc]init] 对象.textlabel.text=@“文字”; return cell };打点调用的label indexpath表示d的是索引路径 indexpath.section是单元格所在的区号 indexpath.row是单元格所在某个区的行号重用列表: dequeue出列reusable重复使用identifier 标识符还是在单元格内容之中做重用操作先将其中的一个给一个标识符 UItableviewcell*对象=[tableview dequeuereusablecellwithidentifier:@“cell”];然后if(对象==nil){ 对象=[[UItableviewcellallo c]initwithstyle:UItableviewcellstyledefault reuse identifier:@“cell”] ; }设置区头默认是不显示的设置区头高度40-(CGFloat)tableView:(UItableview*)tableviewheightForHeaderInsection:(nsinteger)section{ return 40 };使用属性赋值tableview对象.sectionheaderheight=40; 但是这样会使所有区都是40 就不能分开设可以在协议里面写if(section==0){}else if(section==1){}区头的标题设置-(NSstring*)tableView:(UItableview*)tableviewtitleForHeaderInsection:(NSInteger)section{ nsstring*对象=[nsstring stringwithformat:@“%d”,section] ; return 对象; }自定义区头-(UIview*)tableview:(UItableview*)tableviewviewforheaderinsection:(nsinteger)section{ 可以放UIview UIlabel 等视图和控件}区尾的高度-(cgfloat)tableview:(UItableview*)tableviewheightforfooterinsection:(nsinteger)sectiontableview对象.sectionfooterheight=40;区尾的标题设置-(nsstring*)tableview:(UItableview*)tableview titleforfooterinsection:(nsinteger)section 自定义-(UIview*)tableview:(UItableview*)tableview viewforfooterinsection:(nsinteger)section 设置行高-(cgfloat)tableview:(UItableview*)tableview heightForRowAtIndexPath:(nsindexpath *)indexpath{if(indexpath.section==0){return 10;}else{return20}} 第几区行高为几也可以直接tableview对象.rowheight=数字;设置点击某个单元格会调用的方法-(void)tableview:(UItableview*)tableviewdidSelectRowAtIndexPath:(nsindexpath*)indexpath{}设置区的索引,数据内部存放标题-(nsarray*)sectionindextielesfortableview:(UItableview*)tableview{nsarray*对象=[[nssary alloc]initwithobjects:@“”,@“”,@“”,nil] return 对象}使用数组内的代号索引位置取消选中某一单元格时会调用方法-(void)tableview:(UItableview*)tableviewdid_DeselectRowAtIndexpath:(nsindexpath*)indexpath{}取消单元格中选中设置cell对象.selectionstyle=UItableviewcellselectionstylenone;设置单元格下划线的颜色tableview对象.separatorcolor=[UIcolor 颜色];取消单元格下划线tableview对象.separatorstyle=UItableviewcellseparatorstylenone;选择表的样式UItableview*对象=[[UItableview alloc]initwithframe:cgrectmake(0,20,320,460) style:UItableviewstyleplain]; plain是默认格式grouped 自带区头区尾你自己设置单元格的三个属性两个label一个imageview1.textlabel.text2.imageview 最前面的小标识3.detailTextLabel.text=子标题表格上的配件cell对象.accessorytype=UItableviewcellaccessorycheckmark;配件的按钮方法-(void)tableview:(UItableview*)tableview accessorybuttontappedforrowwithindexpath:(nsindexpath *)indexpath 当点击按钮时会执行这个方法强制转换类*对象=(类*)[[类alloc]init];成为第一响应者[对象becomefirstresponder]; 取消第一响应者[对象resignfirstresponder];找到当前行的单元格[tableView cellForRowAtIndexPath:indexPath];找到第0区的第10行 NSIndexPath*对象=[NSIndexPath IndexPathForRow:10 inSection:0];创建表格的类继承UItableViewCell xib也行不用也行关联 [表格.contentview viewWithTag:数字];注册不使用xib的[对象registerclass:[类名class] forcellreuseidentifier:标识符];注册带xib的[对象register nib:[UInib nibwithnibname:@“你创建的类” bundle:nil] forcellreuseidentifier:];两个类中使用奇偶判断if(indexpath.row%2==0)判断数组*对象=[nsbundle mainbundle] loadnibnamed: ower:nilBool 名字[数字]指的就是Bool isunfold=[[array objectatindex:10] boolvalue] 也就是一个多少数的bool数组设置表格内容使用循环的表格-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{static NSString*字符对象=@“标识符”;UITableViewCell*对象=[tableView dequeueReusableCellWithIdentifier:字符对象];if(!对象){对象=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:标识符];}对象.textLabel.text=@“”;return 对象;设置图片的顺时针旋转:图片对象.transform=CGAffineTransformMakeRotation(二分之派是M_PI_2);设置视图回复原始位置图片对象.transform=CGAffineTransformIdetity;记录区间展开还是闭合状态一个bool 数组对象[数]=!对象[数];刷新对应的区[tableview视图对象 reloadSections:[NSIndexSet indexSetWithIndex:对应区索引(button.tag indexpath.row)] withRowAnimation: UITableViewRowAnimationFade];拿到button的父视图UIview*对象=[button superview];viewwithtag 取出视图中tag值的控件全局变量和代理的<>可以在.m文件的@interface 类<>{}如果用数组做row名则 row 设置为return 数组.count单元格内容就是单元格对象.textLabel.text=数组[indexpath.row] 多个区可以换多个数组也可以一个大数组建立警告框格式警告框对象.alertViewStyle=UIAlertViewStylePlainTextInput;开启警告框[alert show];给警告框设置按钮功能-(void)alertView:(UIAlertView*)alertViewclickedButtonAtIndex:(NSInteger)buttonIndex{ 确定按钮的buttonIndex是1 if(buttonIndex==1){ [数组addobject:[alertView textFieldAtIndex:0].text]; NSIndexPath*indexpath=[NSIndexPath indexPathForRow:数组.count-1 inSection=0] [tableview对象insertRowsAtindexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationFade] } }这里是指点击确定在第一个区的最后一行加入你输入框编写的字符NSIndexPath*名称一般为indexpath=[NSIndexPath indexPathForRow:数组.count-1 inSection=0][tableview对象insertRowsAtindexPaths:@[indexpath]withRowAnimation:UITableViewRowAnimationFade]指的是添加数组字符到你指定的位置指定位置可以自己设置删除按钮功能开启一个叫做setediting的方法系统自带的选择删除功能[tableview的对象setEditing:!tableview的对象.isEditing animated:yes];开启功能后开启方法-(void)tableView:(UITableView*)tableViewcommitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIdexPath*)indexPath{ [数组removeObjectAtIndex:indexPath.row]; [tableview或者tableview对象deleteRowAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade]; } 删除你数组中的位置和删除你选定的行@[]创建一个不可变数组NSIndexPath*名称一般为indexpath=[NSIndexPath indexPathForRow:数组.count-1 inSection=0][tableview或者tableview对象deleteRowAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]指的是删除你指定的行也就是进来的位置删除按钮的名称是可以更改的-(nsstring*):tableview titfordeleteconfirmationbuttonforrowatindexpath加号改写类型是 UItableviewcelleditingstyle tableview editingstyleforrowatindexpath[tableview对象register class:[UITableViewCell classclass] forCellReuseIdentifer:@“标记”]就可以在表格的内容中重用了不用判断是否为空[tableview对象或tableview cellForRowAtIndexPath:indexPath]取得你当前单元格。
ios事件的通知方法

1 手动广播者和监听者(Broadcaster and listeners)2键-值观察 key Value Observing3通知中心 notification center4 上下文通知 context notification5用于观察的weituo delegate关于观察者观察者模式是维持两个模块之间抽象关系的最强大的方式之一。
观察者模式包括一个发布已发生事件的模块以及响应该事件的另一模块的若干个的实例。
它和直接调用第二个模块的方法不同,因为第一个模块不需要关注有多少个观察者,从而实现观察者和被观察者之间更加完全的抽象关系。
手动广播者和监听者手动的方式需要广播者保有一个监听者的数组(NSArray)或集合(NSSet)。
在需要通知监听者一个事件的合适时机广播者直接调用各个监听者上相关方法。
在广播者类上你可能需要一个NSMutableArray、NSSet或NSMutableDictionary。
NSMutableDictionary比较适合将事件标识符的类型作为每个监听者的键值。
在广播者上你还需要有监听者注册和取消注册的方法。
给NSArray或NSSet中的每个对象方式消息的方法很简单,如下:[listenersCollectionmakeObjectsPerformSelector:@selector(methodSupportedByEveryListener)]; 优点: 广播者对监听者列表有完全的控制。
缺点: 在集合中手动添加或移除监听者(尤其是在由于其他原因已经不被维护的情况下)。
如果需要发布不同消息的情况下就需要更多的手动工作。
键值观察键值观察协议时朝着自动化如上过程方向的一个很大进步。
在很多情况下,广播者不需要做任何事情。
每个Cocoa对象自动处理用于发布任何对象的addObserver:forKeyPath:options:context:。
如果广播者的“setter”方法遵循某些规则,“setter”方法就会自动触发任何监听者的observeValueForKeyPath:ofObject:change:context:方法。
oc 数组合并

oc 数组合并在编程中,经常需要将两个或多个数组合并成一个数组。
在Objective-C 中,可以通过以下方法将两个数组合并成一个数组:1. 使用 NSArray 类的 arrayWithArray 方法NSArray 类提供了一个 arrayWithArray 方法,可以将一个数组作为参数传递给该方法,并返回一个新的数组,其中包含原始数组中的所有元素。
通过重复对该方法调用来合并多个数组。
例如:NSArray *array1 = @[@'a', @'b', @'c'];NSArray *array2 = @[@'d', @'e', @'f'];NSArray *mergedArray = [NSArray arrayWithArray:array1]; mergedArray = [mergedArray arrayByAddingObjectsFromArray:array2];NSLog(@'%@', mergedArray);输出结果为:(a,b,c,d,e,f)2. 使用 NSMutableArray 类的 addObjectsFromArray 方法与 NSArray 类不同,NSMutableArray 类允许在创建后向其添加或删除元素。
可以使用 NSMutableArray 类的 addObjectsFromArray 方法将一个数组中的所有元素添加到另一个数组中。
例如:NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@'a', @'b', @'c', nil];NSArray *array2 = @[@'d', @'e', @'f'];[array1 addObjectsFromArray:array2];NSLog(@'%@', array1);输出结果为:(a,b,c,d,e,f)总结:以上两种方法都可以将两个数组合并成一个数组,但是在需要经常添加或删除元素的情况下,建议使用 NSMutableArray 类,因为它更具有灵活性和可操作性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/******************************************************************************NSArray*******************************************************************************/ /*-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐创建数组-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐*/NSArray *array = [[NSArray a lloc] i nitWithObjects:@"One",@"Two",@"Three",@"Four",nil];NSArray * a rray1 = [[NSArray a lloc]initWithArray:array];NSArray * a rray2 = [NSArray a rrayWithArray:array];NSArray *array3 = [[NSArray a rrayWithObjects:@"One",@"Two",@"Three",@"Four",nil];[array r elease];[array1 r elease];//-‐ (NSUInteger) C ount;数组所包含对象(元素)个数;NSLog(@"count:%d",[array c ount]);//-‐ (id) o bjectAtIndex: (NSUInteger) i ndex;获取指定索引处的对象(元素);NSLog(@"object :%@",[array o bjectAtIndex:2]);/*查找:根据元素找到对应的索引*/NSArray*array=[[NSArrayalloc]initWithObjects:@"one",@"two",@"three",@"one ", n il];//返回找到的第一个的索引, 一切操作不要越界NSUInteger i ndex = [array i ndexOfObject:@"one"];//在指定范围内查找index = [array i ndexOfObject:@"one" i nRange:NSMakeRange(1, 3)];if (index != N SNotFound) {//找不到返回NSNotFoundNSLog(@"index = %ld",index);}/*数组的抽取*/NSArray * array1 = [array objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]];//NSIndexSet数字集合类//[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)];创建一个数字集合对象//该集合成员是数字1,2,3;/*枚举器*///创建一个正序枚举器NSEnumerator * e nume1 = [array o bjectEnumerator];//枚举器是读数据的while (obj = [enume1 n extObject]) {NSLog(@"%@",obj);}//快速枚举(正序)NSArray *array = [NSArray a rrayWithObjects: @"a",@"b",@"c",@"d",nil];for(id o bj i n a rray){NSLog(@"obj:%@",obj);}//创建一个逆序枚举器NSEnumerator * e nume2 = [array r everseObjectEnumerator];while (obj = [enume2 n extObject]) {NSLog(@"obj = %@",obj);}/*-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐字符串分割到数组-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐*/NSString * s tr = @" Y es,I a m a g ood m an ";//以字符串整体作为分割条件NSArray * array = [str componentsSeparatedByString:@" "];//以@” ” 作为分割条件NSArray*array1 = [str c omponentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" ,"]];//以字符作为分割条件//NSCharacterSet 字符集合//[NSCharacterSet characterSetWithCharactersInString:@" ,"];把字符串@" ,"转化为一个字符集合//这个集合的成员就是字符' '和字符',';//返回值 是NSArray 不要写成NSMuatbaleArray/*-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐数组元素拼接成字符串-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐*/NSString * ptr = [array componentsJoinedByString:@"###"];//把数组元素拼接成字符串NSLog(@”ptr = %@”,ptr);/******************************************************************************NSMutableArray*******************************************************************************//*创建一个可变数组(继承于NSArray)*/NSMutableArray *array = [[NSMutableArray a lloc] i nitWithObjects:@"One",@"Two",@"Three",@"Four",nil];NSMutableArray * a rray1 = [[NSMutableArray a lloc]initWithArray:array]; NSMutableArray * a rray2 = [NSMutableArray a rrayWithArray:array]; NSMutableArray *array3 = [[NSMutableArray a rrayWithObjects:@"One",@"Two",@"Three",@"Four",nil];[array r elease];[array1 r elease];//把不可变转化为一个新的可变数组NSArray *array = [NSArray a rrayWithObjects: @"a",@"b",@"c",@"d",nil]; NSMutableArray * a rray1 = [NSMutableArray a rrayWithArray:array];//增add (insert)[array a ddObject:@"four"];//在最后增加[array i nsertObject:@"iOS" a tIndex:1];//在指定索引插入一个元素//删除(remove)[array removeObjectAtIndex:1];//根据索引删除元素[array r emoveObject:@"one"];//删除数组元素:有几个删几个[array removeObject:@"one" inRange:NSMakeRange(0, 2)]; //在指定范围内删除//替换(replace):修改[array r eplaceObjectAtIndex:0 w ithObject:@"qianfeng"];//交换(exchange)[array e xchangeObjectAtIndex:1 w ithObjectAtIndex:2];/*可变数组排序*///创建一个空的可变数组//(首先设计一个Dog类)NSMutableArray * a rray = [[NSMutableArray a lloc]init];while (i++ < 5) {Dog * d og = [[Dog a lloc]initWithAge:arc4random()%10];[array a ddObject:dog];}[array s ortUsingSelector:@selector(youngThanAge:)];//sortUsingSelector这是一个排序方法;已经实现了,//但是需要我们提供一个准则(就是一个函数)这个准则是(升序)左边 大于右边 进行交换 或者是(降序)左边小于右边进行交换//数组的元素是哪个类?那么这个准则就写在哪个类中//这就是一个准则 左边 大于 右边 进行交换//升序-‐(BOOL)olderThanAge:(Dog *)_dog{return [self a ge] > [_dog a ge];}。