iOS 基础

字符串

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 String

2015-06-25 14:31:41.574 testStoryBoard[3270:157238] 1 String

2015-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 *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:

                                someObject,@"anObject",

                               @"Hello, World!",@"helloString",

                               @42,@"magicNumber",

                                someValue,@"aValue",

                               nil];

    或 NSDictionary *dictionary =@{

                               @"anObject" : someObject,

                               @"helloString" :@"Hello, World!",

                               @"magicNumber" :@42,

                               @"aValue" : someValue

}


     
     

查询字典 

   如果找不到该对象,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值