"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. 让magento的validate验证hidden field

    Object.extend(Validation, { isVisible : function(elm) { return true; }, insertAdvice : function(elm, ...

  2. navigationBar 背景色

    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) { [[UINavigationBar appearance] s ...

  3. 关于MAC的pkg和mpkg的分别

    程序制作完毕后,在mac下通常的方法是要制作一个pkg的安装包,可是你会发现pkg和mpkg的文件出现的比較多,笔者也是经过了一定的试验和尝试,才了解到,pkg是单个文件的pkg,而mpkg事实上是多 ...

  4. 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...

  5. nginx错误日志级别

    在配置nginx.conf 的时候,有一项是指定错误日志的,默认情况下你不指定也没有关系,因为nginx很少有错误日志记录的.但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题.error ...

  6. jquery优化引发的思考

    无意间看到jquery优化的一个细节让我觉得不可思议记录一下.仅仅只是换个地方代码就能提高数倍的效率,带给我的不是个仅是个小技巧,而是一总编程思想,技术大牛往往是在细节上体现. 通过缓存最小化选择操作 ...

  7. 如何安装chrome扩展,以json-handle

    读取本地json文件 chrome插件安装 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json ...

  8. java学习——数组

    元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; array 为引用数据类型|-数组数据类型 | 内存结构:程序在运行时,需要在内存中的分配空间.为了提高运行的效率,有对空间进行不同 ...

  9. InvokeRequired方法和Invoke函数

    c#中禁止跨进程直接访问控件,为了解决这个问题,出现了InvokeRequried属性,当一个控件的InvokeRequried属性值为真时,说明有控件外的线程想要访问它.这时便会调用到Invoke方 ...

  10. 利用monkeyrunner实现Android屏幕连续截图

    MonkeyRunner 什么是monkeyrunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monke ...