字符串


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