码迷,mamicode.com
首页 > 其他好文 > 详细

oc的学习总结2

时间:2015-08-01 18:35:29      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

Foundation

1.NSRange

  NSRange是常用的结构体。NSRange(location,length) location表示的是位置,length表示的是长度范围。用make方法创建常用的结构体。

 

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    NSRange range = {10, 15};
    
    NSRange range1;
    range1.location = 10;
    range1.length = 15;
    
    NSRange range2 = NSMakeRange(10, 15);
    
    NSLog(@"range >>>>> %@", NSStringFromRange(range));
    NSLog(@"range1 >>>>> %@", NSStringFromRange(range1));
    NSLog(@"range2 >>>>> %@", NSStringFromRange(range2));
    NSLog(@"range3 >>>>> %@", NSStringFromRange(NSMakeRange(100, 200)));
    NSLog(@"range4 >>>>> %@", NSStringFromRange((NSRange){100,200}));
    
    
//    NSPoint point;
//    NSSize size;
//    NSRect rect;
    
    
    return 0;
}

2.NSString字符串

  a. 创造字符串   

  NSString *str1=@"hello";   

  b. 格式化输出字符串

  NSString *str3=[NSString stringWithFormat@"hello,%@",@"冀林"];  

  c. 字符串的长度


  NSLog(@"str3‘length>>>>%ld",[str3 length]);


  d. 字符串比较

  NSString *str1=@"hello";
  NSString *str2=@"hello1";
  if (str1==str2)比较的是str1和str2的内存地址
  字符串内容的比较
  if(str1 isEqualToString:str2)
  专门的函数比较ASCII码值
  NSComparisonResult result =[str1 compare str2 options:NSCaseInsensitiveSearch];不区分大小写,相等返回0
  判断附加条件:NSNumericSearch 数字按值来比较,前面的0不影响
  @“1000”和@“0001000”相等
  NSString *str1=@"12013600";
  NSString *str2=@"1360";
  NSComparisonResult result =[str1 compare str2 range:NSMakeRange(3,4)];
  一定范围内的比较,返回值为0,相等

 

  e. 字符串的连接

  NSString *str1 =@“hello”;
  NSString *str2 =[str1 stringByAppendingString:@"weiliang"];
  NSLog(@"str2>>>%@",str2);输出 helloweiliang 
  NSString *str3 =[@"/users/qingyun" stringByAppendingPathComponent:@"Desktop"];
  自动补全路径格式,输出:/users/qingyun/Desktop

 


  f. 字符串查找

 

  NSString *str1 =@"今天我们学习gcd";
  if([str1 containsString:@"gcd"]){
  NSLog(@"查到了gcd。。");
  }
  包含前缀
  NSString *str1=@"410xxxxxxxxx";
  if([str1 hasPrefix:@"410"]){
  NSLog(@"前缀410");
  } hasSuffix@:".exe" 是否包含后缀 .exe
  文件扩展名和路径
  NSString *str1=@"~/Desktop/test.h";
  [str1 pathExtension] 输出str1的文件扩展名h
  [str stringByExpandingTildeInPath] 展开波浪号的路径
  [[str stringByExpandingTildeInPath] stringByAbbreviatingWithTildeInPath] 合闭波浪号

 


  g. 提取子串

  NSString *str1=@"hello,yangxu";
  NSLog(@"substring>>%@",[str1 substringFromIndex:6]);
  输出yangxu
  NSLog(@"subString>>%@",[str1 substringToIndex:6]);
  输出hello,
  NSLog(@"subString >>> %@", [str21 substringWithRange:NSMakeRange(3, 5)]);
  输出lo,ya

 

2.NSMutableString可变字符串


  NSMutableString 继承 NSString   

 

  a.创建可变字符串

  NSMutableString *mstr = [NSMutableString stringWithCapacity:50];
  预先分配50个空间,最优值50
  NSMutableString *mstr = [NSMutableString stringWithString:@"1506"];

  NSMutableString *mstr = [NSMutableString stringWithFormat:@"1506-%@-", @"master"];
  格式化输出字符串 1506—master—

 


  b.追加字符串

  [mstr appendString:@"zhang"];
  NSLog(@"mstr >>> %@", mstr);
  [mstr appendString:@"qinpei"];
  NSLog(@"mstr >>> %@", mstr);
  输出 1506—master—zhangqinpei

 


  c.删除指定字符串

  [mstr deleteCharactersInRange:NSMakeRange(0, 4)];
  NSLog(@"mstr >>> %@", mstr);
  输出 -master-zhangqinpei

 


  d.插入

  [mstr insertString:@"1506" atIndex:0];
  NSLog(@"mstr >>> %@", mstr);
  输出 1506—master—zhangqinpei

 


  e.替换

  [mstr replaceCharactersInRange:NSMakeRange(5, 6) withString:@"teacher"];
  NSLog(@"mstr >>> %@", mstr);
  输出 1506—teacher—zhangqinpei

 


  f.格式化追加

  [mstr appendFormat:@"-%@",@"stage1"];
  NSLog(@"mstr >>> %@", mstr);
  输出 1506—teacher—zhangqinpei-stage1

 


3.数组NSArray


  1创建数组

  NSArray *arr1 =[NSArray arrayWithObjects:@"帅锋",@"xingchen",@"honghai",@"fusong",nil];
  使用arrayWithObjects:创建数组的时候需要以nil结尾,代表数组结束,所以数组中不能存放nil
  NSArry *arr1 =@[@"帅锋",@"xingchen",@"honghai",@"fusong"];
  oc中的c语法,oc2.0加入的
  NSArry中只能存放对象,并且对对象的类别没有统一要求
  NSLog(@"arr1>>>>%@",arr1); 输出数组

 


  2访问数组

  NSLog(@"arr1[2]>>>>%@",arr1[2]);
  NSLog(@"arr1[2]>>>>%@",[arr1 objectAtIndex:2]);

 


  3长度

  NSLog(@"arr1‘length>>>%ld",[arr1 count]);
  输出数组大小,结果为:4

 


  4是否包含

  if(arr1 containObjiect:@"xingchen")判断是否包含对象@“xingchen”

 


  5遍历数组的方式


  A for循环
  B 枚举器 正向 反向
  C 快速枚举

  for(id arrObj in arr1){
  NSLog(@"arrobj>>>%@",arrObj);
  }
  for(对象类型 中间变量 in 需要遍历的数组)
  数组中类型统一的话可以这样
  Car *car1 =[Car new];
  Car *car2 =[Car new];
  Car *car3 =[Car new];
  NSArray *arr3 = @[car1,car2,car3];
  for (Car *car in arr3){
  NSLog("@car>>>%@”,car);
  }
  NSArray是不可变数组,不能更改数组中的元素

 


  6数组连接

  NSArray *arr4=[arr1 arrayByAddingObject:@"yuanao"];添加一个数组元素
  NSArray *arr5=[arr1 arrayByAddingObjectsFromArray:arr2];连接一个数组
  变成了一个新的数组,并不是可变的概念

 


  7字符串分割

  NSString *names=@"guoyu,zhangting,gejing,chaoya";
  NSArray *nameArr=[names componentsSeparatedBystring:@","];
  NSLog("nameArr>>>%@",nameArr);用 , 把这个字符串分割成4个对象,一个数组
  NSString *names2 =[nameArr componentsJoinedByString:@"-"];
  NSLog(@"names>>>%@",names2);用 - 把这个数组四个对象合成一个字符串

 


4.可变数组NSMutableArray


  1 创建可变数组

  c语法写的数组是不可变数组,可变数组这样创建:
  NSMutableArray *mtArr=[NSMutableArray arrayWithArray:@[@"dongdong",@"xinggui"]];

  mtArr[0]=@"qilin";改变数组元素   [mtArr addObject:@"litao"];添加一个数组元素   [mtArr addObjectsFromArray:@[@"sss",@"aaa"]];添加一个数组   [mtArr removeObject:@"qilin"];删除一个数组元素   [mtArr removeObject:@"qilin" inRange:(NSRange)];指定范围删除   [mtArr insertObject:(ID) atIndex:(NSUInteger)];指定为位置插入   [mtArr replaceObjectAtIndex:(NSUInteger) withObject:(id)];指定位置替换

 

 5.字典NSDictionary   

  键值对 散列表或关联数组。用的是键查询优化存储方式,查找速度快

  1创建字典

  NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:@"key",@"value",nil];后面是键,前面是值
  NSDictionary *dict =@{
  @"name":@"jiaxin",
  @"age":@"20",
  @"sex":@"man",
  @"someone":obj
  };快速创建字典,新语法

 


  2访问字典

  NSLog(@“dict[@\"value\"]>>>>%@”,dict[@"value"]); //通过jian访问值 建名都是字符串,值不一定是字符串
  NSlog(@"name>>>%@",[dict valueForKey:@"name"]);

 


  4取所有键名,值

  NSLog(@"all keys>>>%@",[dict allKeys]);
  NSLog(@"all values>>>%@",[dict allValues]);

 


  5字典的遍历

  for(NSString *key in dict){
  NSLog(@"%@>>>%@",key,dict[key]);
  }

 


6.可变字典NSMutableDictionary


  1创建可变字典

  NSMutableDictionary *mtDict=[NSMutableDictionary dictionaryWithDictionary:dict];

 


  2更改键值内容

  mtDict[@"someone"]=@"xulu";建someon的值变成xulu
  mtDict[@"somebody"]=@"lulu";新建一个somebody键并赋值lulu
  [mtDict setValue:@"guangzhi" forKey:@"name"];name的值改为guangzhi
  [mtDict addEntriesFromDictionary:@{@"xxx":@"uuuu",@"yyy":@"fooo"}];直接添加一个字典

 


  3删除字典中的元素也就是键值对

  [mtDict removeObjectForKey:@"xxx"];
  NSLog(@"mtDict >>>>> %@", mtDict);
  [mtDict removeObjectsForKeys:@[@"yyy", @"somebody"]];
  NSLog(@"mtDict >>>>> %@", mtDict);
  [mtDict removeAllObjects];
  NSLog(@"mtDict >>>>> %@", mtDict);

 


  4复杂格式的字典

  NSMutableArray *ar1 = [NSMutableArray array];
  NSMutableArray *ar2 = [NSMutableArray array];
  NSMutableArray *ar3 = [NSMutableArray array];
  NSMutableArray *ar4 = [NSMutableArray array];

  NSMutableDictionary *dt1 = [NSMutableDictionary dictionary];
  NSMutableDictionary *dt2 = [NSMutableDictionary dictionary];
  NSMutableDictionary *dt3 = [NSMutableDictionary dictionary];
  NSMutableDictionary *dt4 = [NSMutableDictionary dictionary];


  NSDictionary *dt = @{@"xxx":@"xxx",
  @"yyy":ar1,
  @"zzz":@{@"z1":@"z1",
  @"z2":@"z2",
  @"z3":@[@"2",@"3",@"4",dt1]}};

  NSLog(@"key >>>> %@", dt[@"zzz"][@"z3"][3][@"key"]);

  NSMutableArray *ar = [NSMutableArray array];
  [ar addObject:dt];
  NSLog(@"ar[0] >>>>> %@", ar[0]);

  NSMutableDictionary *mtDt = [NSMutableDictionary dictionaryWithDictionary:dt];
  [mtDt[@"yyy"] addObject:@"22222"];
  mtDt[@"yyy"] = @"qwedq";
  mtDt[@"yyyy"] = ar1;
  [mtDt setValue:@"yy" forKey:@"yyyyy"];
  //dt[@"xxx"] = @"qwedq";


  NSArray *ar5 = @[ar1, ar2, ar3 ,ar4];
  ar5[0][0] = @"00";//ar5 不可变,ar1可变,所以可以给ar5[0][0]赋值

 

7.装箱拆箱


1 NSValue的装箱与拆箱

typedef struct {
int age;
int SID;
} Student;

Student st = {18, 1000001};
//[mtar addObject:st];
// 任意类型C数据类型都可以通过下面的方式装箱,第一个参数对该类型变量取地址,第二个@encode(C数据类型名字)
NSValue *stValue = [NSValue valueWithBytes:&st objCType:@encode(Student)];
[mtar addObject:stValue];
NSLog(@"mtar >>>>> %@", mtar);
Student st1;
[stValue getValue:&st1]; // 对任意c类型数据装箱之后的拆箱方法(以get命名的方法一般都需要出参,所以不要随便写get命名的方法)
NSLog(@"st1 >>>> %d,%d", st1.age, st1.SID);

 


按照NSValue的方式装箱 int aa,获得一个NSValue对象
强制类型转换,得到NSNumber对象aaaValue,强制类型转换之后aaaValue内存空间中只有NSValude部分的值是有效的,其他NSNumber扩展出来的内存空间是无效的
aaaValue 不是一个完整的NSNumber对象,所以不能使用intValue

NSValue是NSNumber的父类,用valueWithBytes方法装箱过的数值并不能调用NSNumber中相应的快速开箱,在数值常量快速装箱的时候,需要在常量末尾加结束标识(整型 L,浮点f)

标量包含:c的字符串以及数值类型还有结构体,这些类型都有快速装箱和开箱的方法,常用结构体也有,所以使用valueWithBytes获得NSValue对象的场合比较少


2 系统的常用结构体的快速装箱和拆箱

NSRect rect = NSMakeRect(10, 10, 100, 100);
[mtar addObject:[NSValue valueWithRect:rect]];
[mtar addObject:[NSValue valueWithRange:NSMakeRange(10, 15)]];
[mtar addObject:[NSValue valueWithPoint:NSMakePoint(10, 10)]];
NSValue *rangeVl = [NSValue valueWithRange:NSMakeRange(10, 15)];
NSRange range;
[rangeVl getValue:&range];拆箱1
NSRange range1 = [rangeVl rangeValue];拆箱2 常用

NSLog(@"range >>> %@", NSStringFromRange(range));
NSLog(@"range1 >>> %@", NSStringFromRange(range1)); 

 


3 @是快速装箱语法

NSArray *arr = @[@1,@2,@3,@4,@1.11F,@x];
NSLog(@"arr >>>> %@", arr); 

 


4 使用NSNumber装箱与拆箱

NSMutableArray *mtar = [NSMutableArray array];
NSNumber *n1 = [NSNumber numberWithInt:100];
NSNumber *n2 = [NSNumber numberWithChar:y];
NSNumber *n3 = [NSNumber numberWithFloat:3.14F];
NSNumber *n4 = [NSNumber numberWithBool:YES];
[mtar addObject:n1];
[mtar addObject:n2];
[mtar addObject:n3];
[mtar addObject:n4];
NSLog(@"mtar >>>>> %@", mtar);

 


5 拆箱

int a = [n1 intValue];
char c = [n2 charValue];

NSString *str = [n3 stringValue];
NSLog(@"str >>> %@", str);

NSString *str1 = [@10012311 stringValue];
NSString *str2 = [NSString stringWithFormat:@"%d", 10012311];
NSLog(@"str1 >>> %@", str1);

NSString *str3 = @"10012311fsefse";
NSLog(@"int >>>>> %d", [str3 intValue]);

 通过NSNumber的方法能够把所有基本数据类型包装成oc对象,在存放到oc数组中。

拆箱操作: int age = [num1 intValue];

NSValue和NSNumber相似,具体来说前者是后者的父类。NSValue可以包装复杂的基本数据类型,如结构体,枚举。









 

oc的学习总结2

标签:

原文地址:http://www.cnblogs.com/k-on/p/4694347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!