Objective-C基础笔记(9)Foundation常用类NSArray

NSArray用来存储对象的有序列表,它是不可变的

NSArray不能存储C语言中的基本数据类型,如int、float、enum、struct,也不能存储nil,nil代表数组元素的结束

//
//  main.m
//  NSArray
//
//  Created by lixiaoqiang on 14/11/19.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//

#import <Foundation/Foundation.h>

//数组的创建
void arrayCreate(){
    //创建一个空的数组
    NSArray *array = [NSArray array];
    //创建有1个元素的数组
    array = [NSArray arrayWithObject:@"123"];
    //创建有多个元素的数组,nil代表元素的结束
    array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
    //查看元素个数
    int count = [array count]; //或者使用[array.count]
}

//数组的简单使用
void arrayUse(){
    NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
    //判断是否包含了某个元素
    if([array containsObject:@"a"]){
        NSLog(@"包含了子元素a");
    }
    //获取数组最后一个元素
    NSString *last = [array lastObject];
    NSLog(@"最后一个元素是%@", last);
    //获取某个索引处的元素
    NSString *str = [array objectAtIndex:1];
    NSLog(@"索引是1的位置是%@", str);
    //判读元素的索引
    unsigned long index = [array indexOfObject:@"c"];
    NSLog(@"c的位置索引是%zi", index);
}

//定义一个Student对象
@interface Student : NSObject
//添加两个属性
@property (nonatomic, retain) NSString *firstname;
@property (nonatomic, retain) NSString *lastname;

+ (id)student; //构造方法
+ (id)studentWithFirstName:(NSString *)firstname lastname:(NSString *)lastname;
- (void)test;
//用于对象比较(返回值必须是NSComparisonResult类型)
- (NSComparisonResult) compareStudent:(Student *)stu;

@end

@implementation Student

+ (id)student{
    return [[[Student alloc] init] autorelease];
}
+ (id)studentWithFirstName:(NSString *)firstname lastname:(NSString *)lastname {
    Student *stu = [[[Student alloc] init] autorelease];
    stu.firstname = firstname;
    stu.lastname = lastname;
    return stu;
}
- (void)test {
    NSLog(@"Student的test方法");
}

- (NSComparisonResult)compareStudent:(Student *)stu{
    //按照姓进行排序
    return [self.lastname compare:stu.lastname];
}

//相当于java的toString方法
- (NSString *)description{
    return [NSString stringWithFormat:@"[%@ %@]", self.lastname, self.firstname];
}

- (void)dealloc{
    NSLog(@"%@被销毁了");
    [_firstname release];
    [_lastname release];
    [super dealloc];
}
@end

//数组的内存管理
void arrayMemory(){
    Student *stu1 = [[Student alloc] init];
    Student *stu2 = [[Student alloc] init];
    Student *stu3 = [[Student alloc] init];
    NSLog(@"stu1:%zi", [stu1 retainCount]); //计数器为1
    //数组会对添加的对象做一次retain操作
    NSArray *array = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil];
    NSLog(@"stu1:%zi", [stu1 retainCount]); //计数器为2
    NSLog(@"count=%zi", array.count);
    //数组被销毁的时候会对内部的所有元素都做一次release操作
    [array release];
    [stu1 release];
    [stu2 release];
    [stu3 release];
}

void arrayMessage(){
    Student *stu1 = [Student student];
    Student *stu2 = [Student student];
    Student *stu3 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];
    //让数组里面的所有对象调用test方法
    [array makeObjectsPerformSelector:@selector(test)];
}

//遍历数组1
void arrayFor1(){
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    //id == void * 代表任何类型的指针变量
    int count = array.count;
    for(int i=0; i<count; i++){
        id obj = [array objectAtIndex:i];
        NSLog(@"%i位置是%@", i, obj);
    }
}

//遍历数组2
void arrayFor2(){
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    for(id obj in array){
        NSLog(@"%@", obj);
    }
}

//遍历数组3----Block
void arrayFor3(){
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%Zi位置是%@", idx, obj);
        if(idx == 1) *stop = YES; //如果索引为1则停止遍历
    }];
}

//遍历数组4----迭代器
void arrayFor4(){
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    //获取数组的迭代器
    NSEnumerator *enumerator = [array objectEnumerator];
    //反向迭代器
    //NSEnumerator *renu = [array reverseObjectEnumerator];
    //获取下一个遍历的元素
    //[enumerator nextObject];
    id obj = nil;
    while(obj = [enumerator nextObject]){
        NSLog(@"%@", obj);
    }
}

//派生出新的数组
void arrayNew(){
    //添加元素
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", nil];
    NSArray *array2 = [array arrayByAddingObject:@"3"];
    //裁剪元素
    NSRange range = NSMakeRange(1, 2);
    [array2 subarrayWithRange:range];
}

//数组的其他用法
void arrayOther(){
    //利用分隔符拼接
    NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
    NSString *str = [array componentsJoinedByString:@","];
    NSLog(@"%@", str); //1,2,3,4
    //数组写入文件
    NSArray *path = @"/user/apple/Desktop/array.xml";
    [array writeToFile:path atomically:YES];
    //从文件读出数组
    NSArray *array2 = [NSArray arrayWithContentsOfFile:path];
}

//数组排序1
void arraySort1(){
    NSArray *array = [NSArray arrayWithObjects:@"3", @"1", @"4", @"2", nil];
    //指定元素的比较方法(compare:)
    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"array2:%@", array2);
}

//数组排序2
void arraySort2(){
    Student *stu1 = [Student studentWithFirstName:@"sun" lastname:@"home"];
    Student *stu2 = [Student studentWithFirstName:@"dawan" lastname:@"ganban"];
    Student *stu3 = [Student studentWithFirstName:@"lxq" lastname:@"xsyu"];

    NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];

    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)];
}

//数组排序3---Block排序
void arraySort3(){
    Student *stu1 = [Student studentWithFirstName:@"sun" lastname:@"home"];
    Student *stu2 = [Student studentWithFirstName:@"dawan" lastname:@"ganban"];
    Student *stu3 = [Student studentWithFirstName:@"lxq" lastname:@"xsyu"];

    NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];
    [array sortedArrayUsingComparator:^NSComparisonResult(Student *stu1, Student *stu2) {
        return [stu1.lastname compare:stu2.lastname];
    }];
}

//数组排序4,可以用来对对象嵌套排序 比如Student中有一个book对象就可以使用@"book.bookname"对书名排序
void arraySort4(){
    Student *stu1 = [Student studentWithFirstName:@"sun" lastname:@"home"];
    Student *stu2 = [Student studentWithFirstName:@"dawan" lastname:@"ganban"];
    Student *stu3 = [Student studentWithFirstName:@"lxq" lastname:@"xsyu"];
    //创建排序描述器
    NSSortDescriptor *descript = [NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];
    NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];
    //调用排序
    NSArray *array2 = [array sortedArrayUsingDescriptors:descript];
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //arrayFor4();
    }
    return 0;
}

NSMutableArray是可变数组,派生自NSArray,相关操作如下

void arrayCreate(){
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"2", nil];
    [array addObject:@"3"];
    [array removeObject:@"3"];

    [array removeLastObject];
    [array removeAllObjects];
}

void arrayMemory(){
    //对被添加的元素做一次retain操作
    //[array addObject:stu1];
    //对被删除的元素做一次release操作
    //[array removeObject:stu1];

    //当数组被释放的时候会对所有的元素做一次release操作
    //[array release];
}
时间: 2024-08-26 10:16:32

Objective-C基础笔记(9)Foundation常用类NSArray的相关文章

Java基础复习笔记系列 五 常用类

Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String s2 = “hello”:结论:s1 == s2. 字符串常量放在data区. 3. String s3 = new String("hello"); String s4 = new String("hello");结论:s3 != s4.但s3.equals(s4).

Objective-C基础笔记(8)Foundation常用类NSString

一.创建字符串的方法 void stringCreate(){ //方法1 NSString *str1 = @"A String!"; //方法2 NSString *str2 = [[[NSString alloc] init] autorelease]; str2 = @"A String!"; [str2 release]; //方法3 NSString *str3 = [[NSString alloc] initWithString:@"A St

Java基础(十一)常用类总结(一)

这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是比较清晰的!如果你有需要可以在评论中留下您的邮箱我看到一定会免费发给你的!感谢这个平台让我们大家共同进步吧!! 记住 程序员是无私的!!! 也非常欢迎到我的博客内观看 博客地址:http://www.cnblogs.com/duscl/ /* 2:API的概述(了解) (1)应用程序编程接口. (2

Java基础(三)—— 常用类

Object类 常用方法:clone(),equals(),hashCode() clone(): 报错原因:clone()方法的返回值是Object型,然而TestClone继承Object类,所以是大类型转小类型需要强转 报错原因:undandled exception type CloneNotSupportedException(未处理的异常类型CloneNotSupportedException)     运行时报错原因: 原文地址:https://www.cnblogs.com/my

Java基础第二十天总结——常用类String

目录: 一.字符串相关的类 二.JDK8之前的日期时间API 三.JDK8中新日期时间API /*---------------------分割线---------------------*/ 一.字符串相关的类 String的特性 String类:代表字符串,字符串是常量. String是一个final类,代表不可变的字符序列. String对象的字符内容是存储在一个字符数组value[]中的. 字符串常量存储在字符串常量池,目的是共享 字符串非常量对象存储在堆中 String常用方法: St

OC方面的基础笔记摘录

OC方面的基础笔记摘录: 1.类的基本用法 #import <Foundation/Foundation.h>// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件// [email protected] section----// OC中声明和实现是分离的, 两个都必须有.@interface Fraction : NSObject {    // @interface 类名: 父类名字// 在这里

Foundation Kit常用类介绍

Foundation Kit是OS X类库和IOS类库共享的基础类库,里面提供了很多封装类,具体可以见https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/ObjC_classic/,下面介绍一些常用类. 1.字符串类:NSString和NSMutableString. NSMutableString继承于NSString,两者的区别是:NSMutableString是可变的,而NSStr

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

java基础教程-常用类(四)

四.常用类 4.1字符串相关的类(String StringBuffer) 4.1.1String类   4.1.2StringBuffer类(代表可变的) 解释一下可变和不可变 String s1 = “hello”; String s2 = “world”; s1+=s2; 实际上又开辟了一块内存,将hello和world copy进去,s1指向新的内存 而StringBuffer只是在s1后面增加了一块内存,把world加上,不需要copy String与StringBuffer只有这一定