"OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。

17、Foundation框架的数组是有序的对象集合。一般来说这些对象元素会是同一种类型,但是也可以不同。

18、不可变数组是由NSArray类处理的,可变数组是有NSMutableArray类处理的。NSMutableArray类是NSArray类的子类。

19、NSArray类常见方法:

(1)、NSArray *xxx = [NSArray arrayWithObject: @”a”, @”b”, nil];

这个方法可以接收可变数量的对象作为数组元素,最后一个值要指定为nil;

(2)、NSArray *xxx = @[@”a”, @”b”];

这个方法和(1)效果相同,可以不用加“nil”;

(3)、[xxx objectAtIndex: i];

相当于:xxx[i];

(4)、[xxx setObject: o forIndex: i];

相当于:xxx[i] = o;

20、两种输出数组内容的方法的区别:

...

for(i=0; i<10; ++i) {

NSLog(@”%@”, xxx[i]);

}

...

NSLog(@”%@”, xxx);

...

使用第一种方法是多次调用NSLog方法,每次显示一个元素;使用第二种方法,编译器也会显示所有元素,不过元素之间会用逗号隔开并且过行,同时整个数组会用括号括起来。

21、可以使用[xxx addObject: ...]方法往NSMutableArray类数组的末尾添加元素。

22、@”i”和@(i)的区别:

@”i”是字符串i,@(i)是数字i,注意@(i)里面的i必须是数字,在代码中直接写@(i)会报错。

23、定义NSMutableArray数组对象的时候,需要先调用初始化方法,才能往数组里添加元素。至少要调用一下以下方法:

NSMutableArray xxx = [NSMutableArray array];

如果不调用这个方法,即使写了往数组里添加元素的语句,数组里的内容也仍然都是(null)。

24、成员对象?修改成员对象的值对原先对象的影响。

成员对象即是包含在一个对象内部的对象,一般来说为成员对象赋值都只是赋了指针,改变赋值对象的值会影响到成员对象的值。

可参照第八章第6。

26、在for循环中使用in关键字可以遍历数组的元素。使用块enumerateObjectsUsingBlock:也可以遍历。

27、重载init函数的时候,如果涉及到在初始化的过程中顺便要给实例变量(不是属性)赋值,那么在赋值的语句中,直接写“实例变量=形参”即可,不要使用点语法。

比如:

-(instancetype) initWith: (NSString *) theBookName {

self = [super init];

if(self) {

bookName = theBookName;   //实例变量这里不要使用点语法

book = [NSMutableArray array];   //可以顺便给参数列表没有的内容赋值

}

return self;

}

还有另一种方法,可以写成“self->bookName = theBookName”;

28、removeObjectIdenticalTo:方法和removeObject:方法的区别:

(1)、removeObjectIdenticalTo:方法是通过“==”来判断,只要“对象1==对象2”为真,那么removeObjectIdenticalTo:方法就会把两个都删除( “对象1==对象2”为真则表示对象1和对象2指向了内存中同一块区域);

(2)、removeObject:方法是通过“isEqual:”来判断,只要“对象1 isEqual:对象2”为真,那么removeObject:方法就会把两个都删除( “对象1 sEqual:对象2”为真则表示对象1和对象2内容相同);

(3)、“isEqual:”比较的是内容,而“==”只是简单的内存地址比较。一般情况下“==”为真的 “isEqual”就为真,但是“isEqual”为真就不一定“==”也为真。

(4)、看以下例子:

...

NSString *str1 = [[NSString alloc] init];

NSString *str2 = [[NSString alloc] init];

NSString *str3 = [str1 stringByAppendingFormat:@"字符串"];

NSString *str4 = [str2 stringByAppendingFormat:@"字符串"];

NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];

[muArray addObject:@"对象"];

[muArray addObject:str3];

[muArray addObject:str4];

for (NSObject *object in muArray) {

NSLog(@"数组内容:%@", object);

}

if ([str3 isEqual:str4]) {

NSLog(@"str1 isEqual str2");  //这个会显示

}

if (str3 == str4) {

NSLog(@"str1 == str2");   //这个不会显示

}

//[muArray removeObject:str3];   这个会删除str3和str4

[muArray removeObjectIdenticalTot:str3];  //这个只会删除str3

for (NSObject * object in muArray) {

NSLog(@"内容对象:%@", object);

}

...

29、看以下代码:

- (void) removeCard: (NSString *) theName {

AddressCard *ac;

for (ac in book) {   //book是一个NSMutableArray数组

if([ac.name compare: theName] == NSOrderedSame) {

[book removeObject: ac];

NSLog(@”%@删除成功!”, ac.name);

return;

} else {

NSLog(@”没找到”);

return;

}

}

}

这段代码有两个错误:

(1)、如果要删除的对象不是数组里的第一个对象,那么就会输出“没找到”,检查代码可以发现是因为只查找一次就return了,没有继续查找下去;

(2)、一旦有一个对象删除成功了,for in继续循环下去就会报错,报NSGenricException错误。原因是不能在for in循环中修改所遍历的数组,无论你是add或remove都不可以,如果要修改的话,要使用for(;;;)格式。

(3)、使用for(;;;)格式删除数组的内容的话,还有一点一定要注意,比如以下语句:

for(i=0; 1<[array count]; i++) {

if(...) {

[array removeObject: array[i]];

}

}

这个语句有可能在删除的时候会漏了内容,比如有两个紧挨在一起的数组元素是符合删除条件的,那么只会删掉第一个,第二个会被漏过。原因在于:删除掉第一个可删除的元素之后,后面的所有元素的下标就会自减1,即是全部前移了一位,那么如果删除的是第i个元素的话,下一个元素就会自动顶替了i的位置,而for循环下一个要删除的是(i+1),这就造成了紧挨着的第二个可删除元素会被漏掉。

解决方法是在执行了删除方法后,加上一句“i--;”。

30、“==”运算符只判断thing1和thing2的指针数值,即是地址,而不是判断它们所指的内容。有时我们想检查两个对象thing1和thing2是否同一个对象,这时就应该使用运算符“==”,如果是想查看等价性(即这两个对象内容是否相同),那么请使用isEqualToString: 。

31、使用下面的语句可以使程序读取键盘输入的字符串,但是不安全,因为gets()函数会无限地接收键盘输入的内容,甚至内容大到会覆盖掉有存储内容的内存它也不会检测出来:

/*控制台输入字符串并打印*/

char str[50] = {0};

printf("输入名字并回车:");

scanf("%s",str);

NSString *lastName = [NSString stringWithUTF8String:str];

NSLog(@"lastName=%@",lastName);

32、系统提示breakpoint 1.1错误,其实不是错误,是因为在提示的位置被设了断点。

33、sortUsingSelector:(SEL)方法:

(1)、这个方法是对应NSMutableArray对象进行排序,由于NSMutableArray对象是可变的,所以可以直接调用这个方法,调用完后数组就会是排序完的了;

(2)、参数(SEL)必须是一个比较方法,即是要返回NSComparisonResult类的对象,并且这个(SEL)方法必须是这个可变数组里的元素的比较方法,而整个sortUsingSelector:方法是给这个可变数组本身来调用的;

(3)、(SEL)方法可以是在另一个文件中,只要sortUsingSelector:(SEL)方法有import这个文件即可;

(4)、正常排序的结果是从小到大,(即是0到9,从a到z,从大写到小写),如果要反过来,必须要修改(SEL)方法,让方法的比较结果应该返回NSOrderedAscending的换成返回NSOrderedDescending,应该返回NSOrderedDescending的返回NSOrderedAscending;

(5)、以下是一个sortUsingSelector:(SEL)方法的例子:

//AddressCard.m文件

...

(NSComparisonResult) compareName: (AddressCard *) card {

return [self.name compare: card.name];

}

//AddressBook.m文件,已import了AddressCard.m文件

...

(void) sort {

[book sortUsingSelector: @selector(compareName:)]; //book是AddressBook的实例

//变量,是一个NSMutableArray

}

...

这个例子的排序结果是正序;

(6)、如果要倒序,修改compareName:方法如下即可:

(NSComparisonResult) compareName: (AddressCard *) card {

return [card.name compare:self.name];

}

34、使用块来排序:

还有另一种更简单的使用块来排序的方法,以33的内容为例,也可以在AddressBook.m中使用以下代码来排序:

-(void) sort {

[book sortUsingComparator:^(AddressCard obj1, AddressCard obj2) {

return [[obj1 name] compare: [obj2 name]];

}];

}

使用块来排序有两个好处:

(1)、可以在sort方法里面直接定义数组元素的比较方法,不需要另外去添加一个比较方法;

(2)、如果要修改数组元素的比较方法,只需修改sort方法即可,不用动别的部分。

35、关于sortArrayUsingSelector:方法:

sortArrayUsingSelector:方法和sortUsingSelector:方法的功能是一样的,只不过sortArrayUsingSelector:方法是NSArray类的方法,有一个(NSArray *)的返回值,而sortUsingSelector:方法是NSMutableArray类的方法,没有返回值。

同理,使用块来排序的方法中:sortUsingComparator:是NSMutableArray类的方法,sortArrayUsingComparator:是NSArray类的方法。

36、类声明的时候要用*,而id类型声明的时候不用*,其他声明时不用*的有:

NSInteger(typedef的int);

NSComparisonResult;

NSRange(typedef的结构,包含了location和length属性,用来表示字符串的一部分)

37、关于NSValue类:

(1)、NSValue类可以把结构转化为对象,对象才可以存储在数组内;

(2)、将结构转化为对象,称为“包装”,逆处理称为“展开”。

38、“词典”是由“键-对象”组成的数据集合。键必须是单值的,一般是字符串,也可以是其他对象类型。和键关联的值可以是任何类型,但是不能为nil

39、注意以下语句:

...

NSMutableDictionary *md = [NSMutableDictionary dictionary];

[md setObject: @”xxxxxxxxxx”

forKey:@”a”];

NSLog(@”a is %@”, [md objectForKey: @”a”]);

...

分别展示了如何定义、赋值、取值。

40、另外还有以下简便语法:

md[key] = object

相当于:

[md setObject:object forKey:key];

md[key]

相当于

[md objectForKey: key];

注意key和object仍然必须是@“...”的字符串书写格式,或者遵照其他类型对象的书写格式。

41、关于不可变词典对象NSDictionary的两种定义方式:

... //第一种

NSDictoinary *nsd =

[NSDictionary dictionaryWithObjectsAndKeys:

@”xxx”,   //对象

@”a”,     //键,这两个构成一组

@”xxxxxx”,

@”b”,

nil];

...//第二种

NSDictionary *nsd = @{

@”a”:@”xxxxx”,     //键和对象,构成一组

@”b”:@”xxxxxxxx”};

42、NSMutableDictionary类是NSDictionary类的子类。

OC基础13:数字、字符串和集合2的更多相关文章

  1. oc基础 不可变字符串的创建和使用

    oc基础  不可变字符串的创建和使用 简介:下面都是字符串基本用法. 1.字符串的创建 //创建oc常量字符串 NSString *str=@"hello world!"; NSL ...

  2. Python基础之:数字字符串和列表

    目录 简介 数字 字符串 字符串对象str 列表 简介 Python的主要应用是进行科学计算,科学计算的基础就是数字,字符串和列表.本文将会详细的给大家介绍一下这三个数据类型的使用情况. 数字 数字是 ...

  3. 面向对象基础(class0425)字符串与集合

    常用类库 学习.net就是学习它的无数个类库怎么用,先看两个简单的 String 字符串,不可变特性.字符串可以看成字符数组 属性 Length 方法 IsNullOrEmpty() 静态方法 ToC ...

  4. Python基础(数字,字符串方法)

    数字: #二进制转十进制 a=' v=int(a,base=2) print(v) 进制转换 #当前数字的二进制至少有多少位 b=2 v2=b.bit_length() print(v2) 数值二进制 ...

  5. OC基础(13)

    内存管理简介 引用计数器 dealloc方法 野指针\空指针 *:first-child { margin-top: 0 !important; } body > *:last-child { ...

  6. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  7. OC基础12:数字、字符串和集合1

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时要将一些数字数据类型的值当做对象来 ...

  8. OC基础--字符串

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  9. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

随机推荐

  1. UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm & String<Problem D>

    D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. ZOJ3761(并查集+树的遍历)

    Easy billiards Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Edward think a g ...

  3. PHP伪静态与短链接

    如今,Web服务高速发展的时代,各式各类的门户网站,如新浪http://www.sina.com.腾讯http://www.qq.com,这些网站大家都很容易记住,因为这种名称都是有规则和含义的.如果 ...

  4. hdu 5441 Travel(并查集)

    Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is t ...

  5. WINDOWS 下搭建 OC 集成开发环境

    Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1)   使用苹果的平台,集成开发环境使用X ...

  6. Chord算法实现具体

    背景 Chord算法是DHT(Distributed Hash Table)的一种经典实现.下面从网上无节操盗了一段介绍性文字: Chord是最简单.最精确的环形P2P模型."Chord&q ...

  7. 【筛素数表证明】【O[n]】

    void get_prime() { int cnt = 0; for (int i = 2; i < N; i++) { if (!tag[i]) p[cnt++] = i; for (int ...

  8. localStorage和sessionStorage火狐浏览器和其他高级浏览器的区别

    例子: <script>window.onload=function(){ var oSetData = document.getElementById('setData'); var o ...

  9. EF查询数据库框架的搭建

    一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运 ...

  10. (转)Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds

    仰天长啸 Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds... 当启动tomcat时候出现 S ...