字符串
Objective-C 指定字符串的约定与C相同:单个字符会使用单引号括起来,而字符串则使用双引号括起来。但是,Objective-C框架通常不使用C字符串。相反,它们会使用NSString对象。
NSString类为字符串提供了一个对象包装器,它具有诸多优势,如内置了可用于储存任意长度字符串的内存管理、提供了对各种字符编码(特别是Unicode)的支持,以及用于格式化字符串的实用工具等。因为您通常会使用此类字符串,所以Objective-C提供了速写记法,即根据常量值来创建NSString对象。要使用此NSString字面常量,只需在双引号字符串前面添加(@)符号,
NSString *myString =@"My String\n";
NSLog(@"%@",myString);
NSString *anotherCString = [NSStringstringWithFormat:@"%d %@" ,1,@"String"];
NSLog(@"%@",anotherCString);
NSString *fromCSting = [NSStringstringWithCString:"A C string"encoding:NSUTF8StringEncoding];
NSLog(@"%@",fromCSting);
2015-06-25 14:31:41.572 testStoryBoard[3270:157238] My String2015-06-25 14:31:41.574 testStoryBoard[3270:157238] 1 String2015-06-25 14:31:41.574 testStoryBoard[3270:157238] A C string
数字
Objective-C 提供了创建NSNumber对象的速写记法,从而无需调用初始化程序或类工厂方法就可以创建此类对象。只需在数值前面添加(@)符号,并选择一个添加在其后面的值类型指示。例如,创建封装整数值和双精度值的NSNumber对象,可以编写如下代码:
+(NSNumber *) numberWithChar: (char) value;
+(NSNumber *) numberWithInt: (int) value;
+(NSNumber *) numberWithFloat: (float) value;
+(NSNumber *) numberWithBool: (BOOL) value;
- (char) charValue;
- (int) intValue;
- (float) floatValue;
- (BOOL) boolValue;
- (NSString *) stringValue;
NSNumber *myIntValue =@32;
NSNumber *myDoubleValue =@3.2233123;
NSLog(@"%d",myIntValue.intValue);
NSLog(@"%f",myDoubleValue.doubleValue);
2015-06-25 14:40:35.806 testStoryBoard[3407:161867] 32
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 3.223312
您甚至可以使用 NSNumber字面常量来创建封装的Boolean值和字符值。
NSNumber *myBoolValue =@YES;
NSNumber *myCharValue = @'V';
NSLog(@"%d",myBoolValue.boolValue);
NSLog(@"%c",myCharValue.charValue);
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 1
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] V
可以创建 NSNumber对象,表示无符号整型(unsigned integers)、长整型(long integers)、长长整型(longlong integers) 和浮点值 (float values),方法是将字符“U”、“L”、“LL”和“F”分别追加到记号值末尾。例如,创建封装浮点值的NSNumber对象,可以编写如下代码:
NSNumber *myFloatValue =@3.2F;
NSLog(@"%f",myFloatValue.floatValue);
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 3.200000
数组
数组 (NSArray)用于表示有序的对象列表。只要求每个项目都是Objective-C对象;不要求每个对象都是同一个类的实例。 如果要保持数组中的顺序,每个元素都应储存在从0开始的索引中。NSArray类有两个限制:1. 只能存储Objective-c对象,而不能存储原始的C语言基础类型,如int,float,enum,struct和NSArray中的随机指针. 2.不能存储NIL
创建数组
id)arrayWithObject:(id)anObject;
id)arrayWithObjects:(id)firstObject, ...,nil;
如果所提供的其中一个值为nil,则有可能使项目列表意外截断。
id firstObject = @"someString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray =
[NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];
查询数组对象
NSUInteger numberOfItems = [someArray count];
排序数组对象
NSArray类提供了多种方法对其收集的对象进行排序。由于NSArray是不可变的,因此这类方法都会返回新的数组,并在其中包含排好序的项目。
NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"];
NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];
可变性
虽然 NSArray类本身不可变,但它仍可包含可变对象。例如,如果将可变字符串添加到不可变的数组 。
如果要在初始创建数组后添加或移除对象,可使用 NSMutableArray,它提供了很多方法来添加、移除或替换一个或多个对象。
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];
[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
集合
因为集合不包含顺序,用了以 nil 结束且数量不固定的参数。可变的 NSSet 子类名称是 NSMutableSet。
NSSet *simpleSet = [NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil];
即使您多次尝试添加对象,集合也只会储存对单个对象的一次引用。
NSNumber *number = @42;
NSSet *numberSet =[NSSet setWithObjects:number, number, number, number, nil];
// numberSet only contains one object
字典
创建字典
对于dictionaryWithObjectsAndKeys:和initWithObjectsAndKeys:方法,每个对象都会在其键前进行声明,并且对象列表和键必须以nil结束。
NSDictionary
@"anObject",
@"Hello, World!",@"helloString",
@42,@"magicNumber",
@"aValue",
nil];
NSDictionary *dictionary =@{
@"anObject"
@"helloString" :@"Hello, World!",
@"magicNumber" :@42,
@"aValue"
}
查询字典
如果找不到该对象,objectForKey: 方法会返回 nil。
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
同样也可以用下标语法来替代 objectForKey:。
NSNumber *storedNumber = dictionary[@"magicNumber"];
可变性
创建字典后,如果需要添加或移除对象,可使用 NSMutableDictionary 子类。
[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];
使用 NSNull 表示 nil
因为在 Objective-C 中,nil 表示 “无对象” 。因此不可能将 nil 添加到此节所描述的集类中。如果要在集
(collection) 中表示“无对象”,应使用 NSNull 类。
NSArray *array = @[ @"string", @42, [NSNull null] ];
使用 NSNull,null 方法始终都会返回相同的实例。按此方式工作的类称为单例类。
查询字典
如果找不到该对象,objectForKey: 方法会返回 nil。
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
同样也可以用下标语法来替代 objectForKey:。
NSNumber *storedNumber = dictionary[@"magicNumber"];
可变性
创建字典后,如果需要添加或移除对象,可使用 NSMutableDictionary 子类。
[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];
使用 NSNull 表示 nil
因为在 Objective-C 中,nil 表示 “无对象” 。因此不可能将 nil 添加到此节所描述的集类中。如果要在集
(collection) 中表示“无对象”,应使用 NSNull 类。
NSArray *array = @[ @"string", @42, [NSNull null] ];
使用 NSNull,null 方法始终都会返回相同的实例。按此方式工作的类称为单例类。
类
您可以使用 getter 和 setter 来访问属性。getter 返回属性的值,setter 更改属性的值。访问 getter 和setter 的常见语法简写是 dot notation(点表达式)。对于具有读写访问权限的属性,您可以使用点表达式来获取和设定属性的值。
toDoItem.itemName = @"Buy milk"; //Sets the value of itemName
NSString *selectedItemName = toDoItem.itemName; //Gets the value of itemName
方法名称前面的减号 (-) 指示它是一个实例方法,可以用该类的对象调用。
方法用加号 (+) 表示类方法,可通过类本身来调用。
TableView
tableView:cellForRowAtIndexPath: 表格视图中仅显示行的单元格的请求
展示数据的过程:
(1)调用数据源的下面⽅法得知⼀一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
(2)调用数据源的下面⽅法得知每一组有多少行数据
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
(3)调⽤数据源的下⾯⽅法得知每⼀⾏显示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
UITableviewcell的性能问题
cell的工作:iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万 个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象.
解决⽅方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先 通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化⼀一个UITableViewCell对象。
缓存优化的思路:
(1)先去缓存池中查找是否有满足条件的cell,若有那就直接拿来
(2)若没有,就自己创建一个cell
(3)创建cell,并且设置一个唯一的标记(把属于“”的给盖个章)
(4)给cell设置数据
刷新:
- (void)reloadData; //重新加载所有数据
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation //刷新一行cell信息注意点:
定义变量用来保存重用标记的值,这里不推荐使用宏(#define来处理),因为该变量只在这个作用域的内部使用,且如果使用宏定义的话,定义和使用位置太分散,不利于阅读程序。由于其值不变,没有必要每次都开辟一次,所以用static定义为一个静态变量。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 定义变量保存重用标记的值
static NSString *identifier = @"hero";
// 1.先去缓存池中查找是否有满足条件的Cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 2.如果缓存池中没有符合条件的cell,就自己创建一个Cell
if (cell == nil) {
// 3.创建Cell, 并且设置一个唯一的标记
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
NSLog(@"创建一个新的Cell");
}
// 4.给cell设置数据
NJHero *hero = self.heros[indexPath.row];
cell.textLabel.text = hero.name;
cell.detailTextLabel.text = hero.intro;
cell.imageView.image = [UIImage imageNamed:hero.icon];
// NSLog(@"%@ - %d - %p", hero.name, indexPath.row, cell);
// 3.返回cell
return cell;
}
代码块
<return type> (^blockname)(list of arguments) = ^(arguments){body;};
例如 int (^square_block)(int num) = ^(int num) {return (num*num);};
注意:变量时本地的,代码块会在定义时复制并保存它们的状态。
typedef double (^MKSampleMultiBlockRef) (void);
double a=10,b=20;
MKSampleMultiBlockRef multi= ^(void){ return a*b; };
NSLog(@"%f", multi());//200
a=20,b=50;
NSLog(@"%f", multi()); //200 而不是1000 如果a,b是全局变量则是1000