黑马程序员——OC基础---Foundation

时间:2021-12-28 00:29:07

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

第一讲 NSString 的理解

NSString主要是方法的使用!
以下先举例说明:

//1、创建常量字符串。NSString *astring = @"This is a String!";
//2、创建空字符串,给予赋值。

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

astring = @"This is a String!";

[astring release];

NSLog(@"astring:%@",astring);

//

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

NSLog(@"0x%.8x", astring);

astring=@"This is a String!";

NSLog(@"0x%.8x", astring);

[astring release];

NSLog(@"astring:%@",astring);

//3、在以上方法中,提升速度:initWithString方法

NSString *astring = [[NSString alloc] initWithString:@"This is a String!"];

NSLog(@"astring:%@",astring);

[astring release];

创建格式化字符串:占位符(由一个%加一个字符组成)

int i = 1;

int j = 2;

NSString *astring = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%d.This is %i string!",i,j]];

NSLog(@"astring:%@",astring);

[astring release];

用字符串创建字符串,并写入到文件

NSString *astring = [[NSString alloc] initWithString:@"This is a String!"];

NSLog(@"astring:%@",astring);

NSString *path = @"astring.text";

[astring writeToFile: path atomically: YES];

[astring release];

isEqualToString方法 (字符串的比较)

NSString *astring01 = @"This is a String!";

NSString *astring02 = @"This is a String!";

BOOL result = [astring01 isEqualToString:astring02];

NSLog(@"result:%d",result);

compare方法(comparer返回的三种值)

NSString *astring01 = @"This is a String!";

NSString *astring02 = @"This is a String!";

BOOL result = [astring01 compare:astring02] == NSOrderedSame; //NSOrderedSame判断两者内容是否相同

NSLog(@"result:%d",result);

//
NSString *astring01 = @"This is a String!";

NSString *astring02 = @"this is a String!";

BOOL result = [astring01 compare:astring02] == NSOrderedAscending; //NSOrderedAscending判断两对象值的大小(按字母顺序进行比较,astring02大于astring01为真)

NSLog(@"result:%d",result);

//
NSString *astring01 = @"this is a String!";

NSString *astring02 = @"This is a String!";

BOOL result = [astring01 compare:astring02] == NSOrderedDescending; //NSOrderedDescending判断两对象值的大小(按字母顺序进行比较,astring02小于astring01为真)

NSLog(@"result:%d",result);

NSString前后缀检查以及搜索:
1:对于网址的检查
2:对于特定格式的图片/视频等检索

NSRange的使用:
NSRange是Foundation中比较常见的结构体。

typedef struct_NSRange{
NSUInteger location;
NSUInteger length;
}NSRange;

NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。 而NSUInteger类型的定义如下:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef unsigned long NSUInteger;
#else
typedef unsigned int NSUInteger;
#endif

例子:

下面这个例子,将输出IPA:

NSString *homebrew = @"Imperial India Pale Ale (IPA)";
// Starting at position 25, get 3 characters
NSRange range = NSMakeRange (25, 3);
// This would also work:
// NSRange range = {25, 3};
NSLog (@"Beer shortname: %@", [homebrew substringWithRange:range]);

搜索字符串:

NSString *homebrew = @"Imperial India Pale Ale (IPA)";
NSRange range = [homebrew rangeOfString:@"IPA"];
// Did we find the string "IPA" ?
if (range.length > 0)
NSLog(@"Range is: %@", NSStringFromRange(range));

上面的程序将输出Range is: {25, 3}。NSStringFromRange()方法,将一个NSRange返回一个NSString。而另外一个函数NSRangeFromString()则是将NSString转换为NSRange
下面这个例子将从后向前反向搜索字符串:

NSString *homebrew = @"Imperial India Pale Ale (IPA)";
// Search for the "ia" starting at the end of string
NSRange range = [homebrew rangeOfString:@"ia" options:NSBackwardsSearch];
// What did we find
if (range.length > 0)
NSLog(@"Range is: %@", NSStringFromRange(range));

上面的程序将输出:Range is: {12, 2}

如果你要获取一个字符串或者一个数组中的一个子集,那么使用NSRange会很方便的定义这个子集。

Declaration: typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;

创建NSRange的方法定义

Declaration: NSRange NSMakeRange (
NSUInteger loc,
NSUInteger len
);

例如获取一个数组的一个子集:

NSRange range = NSMakeRange(0, 5); 
NSArray *subArray = [self.states subarrayWithRange:range];

这样就获得了这个数组中0开始的5个元素的子集。

第二讲 字符串NSMutableString

NSMutableString类继承自NSString,所以在NSString中的方法在NSMutableString都可以使用. NSMutableString和NSString的区别在于NSMutableString是动态的字符串,可以动态的添加,修改,删除等。在前面提到了就和.NET中的string和StringBuilder的区别一样。

  1. 添加字符串

向字符串末尾添加字符串可以使用appendString方法和appendFormat方法。appendString方法主要用于向字符串末尾添加一个字符串;appendFormat 方法用于向字符串末尾添加多种类型的字符串,相当于.NET中的appendFormat 方法使用占位符。

NSMutableString *str=[[NSMutableString alloc] init];
[str appendString:@"NSMutableString 字符串"];
NSLog(@"appendString=%@",str);

[str appendFormat:@" --我的名字:%@ , 年龄 %d",@"Object C",10];
NSLog(@"appendFormat: %@",str);

效果如下:appendString=NSMutableString 字符串
appendFormat: NSMutableString 字符串 –我的名字:Object C , 年龄 10

2 删除字符串
在NSMutableString中使用stringWithString方法来初始化字符串;使用rangeOfString获取某个字符串在原字符串的位置以及长度;使用deleteCharactersInRange方法删除特定位置的字符串

NSMutableString *str=[NSMutableString stringWithString:@"Object C 之NSMutableString类"];
NSLog(@"stringWithString= %@ ",str);

NSRange range= [str rangeOfString:@"Mutable"];
NSLog(@"Location=%d",range.location);
NSLog(@"length=%d",range.length);

[str deleteCharactersInRange:range];
NSLog(@"deleteCharactersInRange=%@",str);

字符串的拷贝:

因为NSMutableString是引用类型,也就是指针类型,当一个变量赋值给另外一个变量的时候,两者其实是指向的同一个地址。

//创建字符串
NSMutableString *str1 = [NSMutableString stringWithString: @"字符串1"];
NSMutableString *str2;

//字符串赋值
str2 = str1;

[str2 appendString: @" 和字符串2"];

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

NSLog (@"str2 = %@", str2);
结果:
str1 = 字符串1 和字符串2,str2 = 字符串1 和字符串2

字符串类型转换:
intValue用于将字符串类型转换为int 类型

integerValue用于将字符串类型转换为NSInteger 类型

floatValue用于将字符串类型转换为float类型

doubleValue用于将字符串类型转换为double类型

        NSString *str1=@"123";
int value1=[str1 intValue];
NSLog(@"转化为int类型: str1=%d",value1);

NSString *str2=@"1234";
NSInteger value2=[str2 integerValue];
NSLog(@"转化为NSInteger类型: str2=%i",value2);

NSString *str3=@"3.1415";
float value3=[str3 floatValue];
NSLog(@"转换为float类型: str3=%0.4f",value3);

double value4=[str3 floatValue];
NSLog(@"转换为double类型: str3=%0.4f",value4);

结果:转化为int类型: str1=123,转化为NSInteger类型: str2=1234,转换为float类型: str3=3.1415,转换为double类型: str3=3.1415

第三讲 NSArray 的介绍和使用

NSArray是不可变的,而且只能存储Object-C对象,另外数组的最后一个元素一定是nil,表示结束。
注:这些集合类只能收集cocoa对象(NSOjbect对象),如果想保存一些原始的C数据(例如,int, float, double, BOOL等),则需要将这些原始的C数据封装成NSNumber类型的,NSNumber对象是cocoa对象,可以被保存在集合类中。
数组常见的用法首先是创建数组,然后对数组进行操作。
对数组进行的操作可以分为:增(插入),删,改,查 , 取,遍历,排序,比较,
对于NSArray来说,因为本身是不可变的,所以对NSArray的操作没有增和删。
NSArray *array = [ NSArray alloc] init ];
1.取
- (id)objectAtIndex : (NSInteger *)aValue 得到所给下标的数组中的值
- (NSInteger *)indexOfObject: (id)object 得到所给对象在数组中的下标
- lastObject; 得到数组中最后一个值
例如:
Student *stu1=[Student studentWithName:@”张三” andHobby:@”hk” andAge:21];
Student *stu2=[Student studentWithName:@”李四” andHobby:@”hjik” andAge:25];
Student *stu3=[Student studentWithName:@”王五” andHobby:@”fds” andAge:23];
NSArray *stuArray=[[NSArray alloc]initWithObjects:stu1,stu2,stu3, nil];//创建数组对象并 初始化内容
int c=[stuArray count];//返回是数组元素个数
for (int i=0; i
{
Student *st=[stuArray objectAtIndex:i];//获取数组相关下表对应的元素
[st sayHi];
}
NSLog(@”%d”,[stuArray indexOfObject:stu3]);//indexOfObject是得到所给对象在数组中的下标
结果是:
我叫张三,今年21,我的爱好是hk
我叫李四,今年25,我的爱好是hjik
我叫王五,今年23,我的爱好是fds
2.查
- containsObject :(id)object 查询是否包含所给对象
3.遍历数组
三种方法:1.in 2.遍历器 3.for
另外,NSArray还有一个非常强大的方法 -makeObjectsPerformSelector () ;这个函数可以将一个操作 作用在数组中的每个元素上。例如:
[array makeObjectsPerformSelector:@selector(get:)] ;
4.排序
1.字符串数组排序
IOS提供一个sortedArrayUsingSelector ()函数,用于对字符串数组进行排序,方法会在排序后返回一个新的数组。
[array sortedArrayUsingSelector (@selector(xxxx:))];
xxxx:方法需要你自己根据实际情况设定排序方式。有默认的排序方法 compare :
例如
Student *stu1=[Student studentWithName:@”张三” andHobby:@”hk” andAge:21];
Student *stu2=[Student studentWithName:@”李四” andHobby:@”hjik” andAge:25];
Student *stu3=[Student studentWithName:@”王五” andHobby:@”fds” andAge:23];
NSArray *stuArray=[[NSArray alloc]initWithObjects:stu1,stu2,stu3, nil];//创建数组对象并 初始化内容
NSArray *sortedAry=[stringAry sortedArrayUsingSelector:@selector(compare:)];//@selector是关键字,后面跟的是函数
NSLog(@”%@”,sortedAry);//数组输出
NSArray *sortedArystu=[stuArray sortedArrayUsingSelector:@selector(compareStu:)];
for (Student *st in sortedArystu)
{
NSLog(@”%@=%d”,st.stuName,st.stuAge);
}
结果:
张三=21
李四=21
王五=25
2.数字数组排序
将数字加入数组,首先要转换成NSNumber。然后再使用sortedArrayUsingSelector:
注意取出数字元素的时候要换一下类型
NSNumber indicator = (NSNumber )[ numberArray objectAtIndex:idx];
int value = [ indicator intValue ];

    3.对对象数组排序
可以使用NSSortDescriptor对对象数组进行排序。
@interface Person :NSObject {
NSString *firstName;
NSString *lastName;
}
@property (nonatomic , retain ) NSString *firstName ;
@property (nonatomic , retain ) NSString *lastName ;
现在,有一个由Person对象组成的数组,对这个数组排序,使用sortUsingDescriptors:
NSSortDescriptor *sorter = [ NSSortDescriptor alloc ] initWithKey : xxx ascending:YES];
[array sortUsingDescriptors : [ NSArray arrayWithObject:sorter ]] ;
  1. 对象数组过滤
    ios提供了一个filteredArrayUsingPredicate 方法,通过给定条件来进行过滤,过滤后形成一个新的数组。 而NSMutableArray提供了一个filterUsingPredicate方法,在原数组中保留符合条件的数组元素。

6.增加和删除
NSArray本身是不可变的,所以也不能够进行正常的增加和删除操作,这里的这些操作只针对于NSMutableArray,写到这里是为了查询方便。
1.增加
2.删除
删除数组元素可以使用数组的removeObjectAtIndex () ,因为数组在动态变化,所以比较安全的做法是,将满足条件的数组放入一个临时数组里,再将这个数组返回:
- (NSArray )filterPersonWithLastName : (NSString )filterTest {
Person *person = [[Person alloc] init];
NSMutableArray *personList = [ person creatTempraryList ] ;
NSLog (@ “before”);
[self printingPersonArray : personList ];
NSMutableArray *personsToRemove = [NSMutableArray array] ;
for ( Person *person in personList){
if (filterTest && [filterTest rangeOfString :person.lastName options:NSLiteralSearch].length == 0 )
[ personsToRemove addObject : person];
}
[personList removeObjectInArray : personsToRemove ] ;
NSLog (@”after”);
[ self printingPersonArray:personList ];
[ person release];
return personList;
}

下面图片里是帮助文档里的,也就是NSArray所有的方法,我打出来的是学过的,也是比较常用的方法。

下面介绍一下Array熟悉的用法:
- (NSUInteger)count;
获取NSArray中对象的个数
- (id)objectAtIndex:(NSUInteger)index;
获取NSArray中index位置的对象
- (NSArray *)arrayByAddingObject:(id)anObject;
把anObject添加到数组的末尾
- (NSArray )arrayByAddingObjectsFromArray:(NSArray )otherArray;
把otherArray数组中的对象添加盗数组的末尾

  • (NSString )componentsJoinedByString:(NSString )separator;
    把数组中的元素以separator为分割拼接起来组成一个NSString

    • (BOOL)containsObject:(id)anObject;
      判断anObject是否在数组中

    • (NSString *)description;
      对数组中对象的描述,可以输出数组中的对象(待进一步确定)

    • (NSString *)descriptionWithLocale:(id)locale;

    • (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level;

    • (id)firstObjectCommonWithArray:(NSArray *)otherArray;
      返回NSArray和otherArray中第一个相同的对象

    • (id)arrayWithObjects:(constid [])objects count:(NSUInteger)cnt;

NSString *string[5];  
string[0] = @"First";
string[1] = @"Second";
string[2] = @"Third";
string[3] = @"Forth";

NSArray *array = [NSArray arrayWithObjects:string count:3];
输出结果:First, Second, Third
  • (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range;
    从数组objects中取出对应NSRange的数据,range中的数据表示从range.location开始到range.length的元素
NSArray *mArray = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", nil];  
id *objects;
NSRange range = NSMakeRange(2, 3);
objects = malloc(sizeof(id) * range.length);
[mArray getObjects:objects range:range];
for (NSInteger i = 0; i < range.length; i++)
{
NSLog(@"objects: %@", objects[i]);
}
free(objects);
  • (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
    在整个数组中,在range范围内的anObject对象的索引位置
  • (NSEnumerator *)objectEnumerator;
    顺序获取数组的NSEnumerator
  • (NSEnumerator *)reverseObjectEnumerator;
    倒序获取数组的NSEnumerator
NSEnumerator *enumerator = [mArray objectEnumerator];  

id object;
while((object = [enumerator nextObject]))
{
NSLog(@"object:%@",object);
}