oc的学习总结2

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 *[email protected]"hello";   

  b. 格式化输出字符串

  NSString *str3=[NSString [email protected]"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");
  } [email protected]:".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 [email protected][@"帅锋",@"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可以包装复杂的基本数据类型,如结构体,枚举。

时间: 2024-08-06 08:02:41

oc的学习总结2的相关文章

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员—oc语言学习心得—block

黑马程序员—oc语言学习心得—block -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,程序一般用typedef定义一个block类型 然后调用 typedef void(^xxx)(); 可使用助记符 inlineblock 2,Block内部可以访问外部变量:默认情况下,Block内部不能修改外部的局部变量 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改. 3,block的作用: 利用block封

黑马程序员——oc语言学习心得----NSFileManager

黑马程序员——oc语言学习心得----NSFileManager -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 自己总结了下NSFileManager的简单几个用法 : // 首先要创建文件管理器 NSFileManager *fm=[NSFileManager defaultManager]; 1,判断文件是否存在 fileExistsAtPath: 2,判断文件是否是目录 fileExistsAtPath: 3, 判断文件是否可读

有关Oc语言学习的一些感受及对面向过程和面向对象的理解

不得不说,接触编程过后,我的生活从来没有这么规律过,每天按时吃早中晚的饭,每天早九晚九的学习,我就在想我的大学生活怎么就没有这么认真过呢?算了还是不提大学了,惭愧的狠.       说正事吧,我学的ios软件开发,在这里之前的一个星期,把我曾经仅学了其三分之一的C语言基本完整的学了一遍,七天学习加复习相当于我曾经的一学期!这意味着什么,还是意会吧.然而C语言只是学习ios开发的桥梁,通过C语言过度到Object-c语言简称Oc,Oc才是进入ios开发大门的钥匙和基石.之前老师一再强调,基础一定要

oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍

一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类的方法,绝对不是再写一个自己类的方法. 代码中原话叫:子类重写父类方法. 因为父类定义的方法不一定适用于子类. 注意:如果有重写,那么调用的是自己重写后的方法,如果没有重写,那么就调用的是父类的方法. 所以我们方法有一个执行的过程: 1.先去自己类里面找这个方法,如果找到就执行. 2.如果没找到,就

24-黑马程序员------OC 语言学习笔记--- autorelease和ARC

  黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- autoreleaseOC提供了autorelease语法,系统可以將很多对象放到一个自动释放池中,在某个时刻统一release一次.这样就不用再次调用release方法.1.autorelease的基本用法:   1>

黑马程序员-OC加强学习日记-Foundation框架中的字符串和数组

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.Foundation框架 1.概念:框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易. 为所有程序开发奠定基础的框架称为Foundation框架 2.使用:要想使用Foundation框架中的功能,包含它的主文件即可 #import <Foundation/Foundation.h> 二.NSString: 不可变字符串类   一个NSString对象

OC-学习Tips

(Objective-C) 13,多参数方法:(函数名:f::) 参数能够在 : 前面设置一个标签label,标签label也是函数名的一部分,方便阅读(不带标签实际上也有个匿名标签),第一个参数不能有标签,实际上函数名就是第一个参数的标签. 14,OC不是严格的函数重载(和C++不同),主要看标签中,函数名和参数数量是否相同,不是看参数类型,如: - (int)g:(int)x; - (int)g:(flota)x; //错误,方法冲突了 - (int)g:(int)x:(int)y; //正

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不