【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)

简介: 【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)

一. 字符串 API

1. NSString 用法简介

(1) NSString API 介绍

NSString 功能 :


-- 创建字符串 : 使用 init 开头的实例方法, 也可以使用 String 开头的方法;


 // init 开头方法创建字符串

 unichar data[5] = {97, 98, 99, 100, 101};

 NSString * str = [[NSString alloc] initWithCharacters : data length : 5];

 // string 开头方法创建字符串

 char * con_str = "Hello World";

 NSString * str1 = [NSString stringWithUTF8String : con_str];

-- 字符串获取 : 读取文件 或 网络 URL 初始化字符串;


-- 字符串写出 : 字符串内容 写入 文件 或 URL;


-- 长度获取 : 获取字符串长度, 既可获取字符串内包含的字符个数, 又可获取字符串包含的字节个数;


 // 字符串个数 字节数统计

 NSLog(@"str char count is : %lu", [str length]);

 NSLog(@"str utf8 byte count is : %lu", [str lengthOfBytesUsingEncoding : NSUTF8StringEncoding]);

-- 获取子字符串 : 既可以获取指定位置的字符, 又可以获取指定范围的字符串;


 // 获取 前 5 个字符组成的字符串

 NSString * str5 = [str3 substringToIndex : 5];

 // 获取 从 第五个字符开始的字符串

 NSString * str6 = [str3 substringFromIndex : 5];

 // 获取 从 第五个 到 第九个 字符串

 NSString * str7 = [str3 substringWithRange : NSMakeRange(5, 9)];

-- 获取 C 字符串 : 获取 NSString * 对应的 char * 字符串;


-- 连接字符串 : 将 2 个字符串连接;


 //字符串拼接

 NSString * str3 = [str2 stringByAppendingString : @", append this"];

 NSString * str4 = [str2 stringByAppendingFormat : @", append %@", @"format"];

-- 分隔字符串 : 将 一个 字符串分成两个;


-- 查找 字符 或 子字符串 : 查找字符串内指定的字符 和 子字符串;


 // 获取 "append" 出现的位置

 NSRange pos = [str3 rangeOfString : @"append"];

 NSLog(@"append position from %ld, length %ld", pos.location, pos.length);

-- 替换字符串 :


-- 比较字符串 :


-- 字符串大小比较 :


-- 对字符串中得字符进行大小写转换 :


 // 大小写转换

 NSString * str8 = [str2 uppercaseString];

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

(2) NSString 示例代码

示例代码 :


/*************************************************************************
    > File Name: OCNSStringDemo.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 二 10/ 6 17:04:29 2015
 ************************************************************************/
#import <Foundation/Foundation.h>
int main(int argc, char * argv[])
{
  @autoreleasepool {
  // init 开头方法创建字符串
  unichar data[5] = {97, 98, 99, 100, 101};
  NSString * str = [[NSString alloc] initWithCharacters : data length : 5];
  // string 开头方法创建字符串
  char * con_str = "Hello World";
  NSString * str1 = [NSString stringWithUTF8String : con_str];
  NSLog(@"str : %@, str1 : %@", str, str1);
  // 将字符串写入文件
  [str1 writeToFile : @"octopus.txt"
    atomically : YES
    encoding : NSUTF8StringEncoding
    error : nil];
  // 从文件读取字符串
  NSString * str2 = [NSString stringWithContentsOfFile : @"octopus.txt"
    encoding : NSUTF8StringEncoding
    error : nil];

 

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

 //字符串拼接

 NSString * str3 = [str2 stringByAppendingString : @", append this"];

 NSString * str4 = [str2 stringByAppendingFormat : @", append %@", @"format"];

 NSLog(@"str3 : %@, str4 : %@", str3, str4);

 // 字符串个数 字节数统计

 NSLog(@"str char count is : %lu", [str length]);

 NSLog(@"str utf8 byte count is : %lu", [str lengthOfBytesUsingEncoding : NSUTF8StringEncoding]);

 // 获取 前 5 个字符组成的字符串

 NSString * str5 = [str3 substringToIndex : 5];

 // 获取 从 第五个字符开始的字符串

 NSString * str6 = [str3 substringFromIndex : 5];

 // 获取 从 第五个 到 第九个 字符串

 NSString * str7 = [str3 substringWithRange : NSMakeRange(5, 9)];

 

 NSLog(@"str5 : %@, str6 : %@, str7 : %@", str5, str6, str7);

 // 获取 "append" 出现的位置

 NSRange pos = [str3 rangeOfString : @"append"];

 NSLog(@"append position from %ld, length %ld", pos.location, pos.length);

 

 // 大小写转换

 NSString * str8 = [str2 uppercaseString];

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

}

}


-- 执行结果 :


bogon:6.6 octopus$ clang -fobjc-arc -framework Foundation OCNSStringDemo.m 
bogon:6.6 octopus$ ./a.out 
2015-10-06 17:52:40.007 a.out[1095:507] str : abcde, str1 : Hello World
2015-10-06 17:52:40.018 a.out[1095:507] str2 : Hello World
2015-10-06 17:52:40.018 a.out[1095:507] str3 : Hello World, append this, str4 : Hello World, append format
2015-10-06 17:52:40.019 a.out[1095:507] str char count is : 5
2015-10-06 17:52:40.020 a.out[1095:507] str utf8 byte count is : 5
2015-10-06 17:52:40.020 a.out[1095:507] str5 : Hello, str6 :  World, append this, str7 :  World, a
2015-10-06 17:52:40.021 a.out[1095:507] append position from 13, length 6
2015-10-06 17:52:40.021 a.out[1095:507] str8 : HELLO WORLD
2. NSMutableString 可变字符串

(1) NSMutableString 简介

NSString 与 NSMutableString 对比 :


-- NSString 缺陷 : NSString 字符串一旦被创建, 字符串序列是不可改变的;


-- NSMutableString 优点 : NSString 中所有的方法, NSMutableString 都可以调用, NSMutableString 对象可以当做 NSString 对象使用;


(2) NSMutableString 源码示例

源码示例 : 
/*************************************************************************
    > File Name: OCNSMutableStringTest.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 二 10/ 6 18:03:28 2015
 ************************************************************************/
#import <Foundation/Foundation.h>
int main(int argc, char * argv[])
{
  @autoreleasepool {
  NSMutableString * str = [NSMutableString stringWithString : @"Hello World"];
  NSLog(@"str : %@", str);
  // 字符串追加
  [str appendString : @" Octopus"];
  NSLog(@"str : %@", str);
  [str insertString : @"Insert " atIndex : 6];
  NSLog(@"str : %@", str);
  [str deleteCharactersInRange : NSMakeRange (6, 2)];
  NSLog(@"str : %@", str);
  [str replaceCharactersInRange : NSMakeRange(6, 9)
         withString : @" Replace "];
  NSLog(@"str : %@", str);
  }
}


-- 运行结果 :


bogon:6.6 octopus$ clang -fobjc-arc -framework Foundation OCNSMutableStringTest.m 
bogon:6.6 octopus$ ./a.out 
2015-10-06 18:44:04.498 a.out[1180:507] str : Hello World
2015-10-06 18:44:04.500 a.out[1180:507] str : Hello World Octopus
2015-10-06 18:44:04.500 a.out[1180:507] str : Hello Insert World Octopus
2015-10-06 18:44:04.501 a.out[1180:507] str : Hello sert World Octopus
2015-10-06 18:44:04.501 a.out[1180:507] str : Hello  Replace d Octopus

二. 日期 时间 API

1. 日期 时间 示例

示例源码 :


/*************************************************************************
    > File Name: OCNSDateTest.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 二 10/ 6 21:12:10 2015
 ************************************************************************/
#import <Foundation/Foundation.h>
int main(int argc, char * argv[])
{
  @autoreleasepool {
  //当前时间
  NSDate * date = [NSDate date];
  NSLog(@"date : %@", date);
  //一天后的时间
  NSDate * date1 = [[NSDate alloc] initWithTimeIntervalSinceNow : 3600 * 24];
  NSLog(@"date1 : %@", date1);
  //3天前时间
  NSDate * date2 = [[NSDate alloc] initWithTimeIntervalSinceNow : -3 * 3600 * 24];
  NSLog(@"date2 : %@", date2);
  //获取从 1970年1月1日 开始 20年后的日期
  NSDate * date3 = [NSDate dateWithTimeIntervalSince1970 : 3600 * 24 * 366 * 20];
  NSLog(@"date3 : %@", date3);
  //获取当前 Local 下对应的字符串
  NSLocale * cn = [NSLocale currentLocale];
  NSLog(@"date1 : %@", [date1 descriptionWithLocale : cn]);
  //日期比较
  NSDate * date_earlier = [date earlierDate : date1];
  NSDate * date_later = [date laterDate : date1];
  NSLog(@"date_earlier : %@, date_later : %@", date_earlier, date_later);
  //比较结果 枚举值 之前 NSOrderAscending 相同 NSOrderdSame 之后 NSOrderdDescending
  switch ([date compare : date1])
  {
    case NSOrderedAscending :
    NSLog(@"NSOrderedAscending");
    break;
    case NSOrderedSame :
    NSLog(@"NSOrderedSame");
    break;
    case NSOrderedDescending :
    NSLog(@"NSOrderedDescending");
    break;
  }
  //比较时间差
  NSLog(@"date - date1 : %g second", [date timeIntervalSinceDate : date1]);
  NSLog(@"date - now : %g second", [date timeIntervalSinceNow]);
  }
}

-- 执行结果 :


bogon:~ octopus$ clang -fobjc-arc -framework Foundation OCNSDateTest.m 
bogon:~ octopus$ ./a.out 
2015-10-06 21:45:23.441 a.out[1400:507] date : 2015-10-06 13:45:23 +0000
2015-10-06 21:45:23.442 a.out[1400:507] date1 : 2015-10-07 13:45:23 +0000
2015-10-06 21:45:23.442 a.out[1400:507] date2 : 2015-10-03 13:45:23 +0000
2015-10-06 21:45:23.442 a.out[1400:507] date3 : 1990-01-16 00:00:00 +0000
2015-10-06 21:45:23.444 a.out[1400:507] date1 : 2015年10月7日 星期三 中国标准时间下午9:45:23
2015-10-06 21:45:23.444 a.out[1400:507] date_earlier : 2015-10-06 13:45:23 +0000, date_later : 2015-10-07 13:45:23 +0000
2015-10-06 21:45:23.445 a.out[1400:507] NSOrderedAscending
2015-10-06 21:45:23.445 a.out[1400:507] date - date1 : -86400 second
2015-10-06 21:45:23.445 a.out[1400:507] date - now : -0.011359 second

2. 日期格式器

(1) NSDateFormatter 作用

NSDateFormatter 作用 : 使 NSDate 与 NSString 对象之间相互转化;


NSString 与 NSDate 转换步骤 :


-- 1.创建 NSDateFormatter 对象 :


-- 2.设置格式 : 调用 NSDateFormatter 的 "setDateStyle :", "setTimeStyle :" 方法设置时间日期格式;


-- 3. NSDate -> NSString : 调用 NSDateFormatter 的 "stringFromDate :" 方法;


-- 4. NSString -> NSDate : 调用 NSDateFormatter 的 "dateFromString :" 方法;


(2) NSDateFormatter 时间日期格式

时间 日期格式 枚举 :


-- NSDateFormatterNoStyle : 不显示日期, 时间;


-- NSDateFormatterShortStyle : 显示短日期;


-- NSDateFormatterMediumStyle : 显示中等日期;


-- NSDateFormatterLongStyle : 显示长日期;


-- NSDateFormatterFullStyle : 显示完整日期;


-- 自定义模板 : 调用 NSDateFormatter 的 "setDateFormat :" 方法 设置 时间 日期格式;


(3) NSDateFormatter 代码示例

示例代码 :


/

*************************************************************************
    > File Name: OCNSDateFormatterTest.m
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 三 10/ 7 14:10:32 2015
 ************************************************************************/
#import <Foundation/Foundation.h>
int main(int argc, char * argv[])
{
  @autoreleasepool {
  //创建日期
  NSDate * date = [NSDate date];
  //初始化 Locale 信息
  NSLocale * cn = [[NSLocale alloc] initWithLocaleIdentifier : @"zh_CN"];
  NSLocale * en = [[NSLocale alloc] initWithLocaleIdentifier : @"en_US"];
  //创建并设置 NSDateFormatter
  NSDateFormatter * style_short = [[NSDateFormatter alloc] init];
  [style_short setDateStyle : NSDateFormatterShortStyle];
  NSDateFormatter * style_medium = [[NSDateFormatter alloc] init];
  [style_medium setDateStyle : NSDateFormatterMediumStyle];
  NSDateFormatter * style_long = [[NSDateFormatter alloc] init];
  [style_long setDateStyle : NSDateFormatterLongStyle];
  NSDateFormatter * style_full = [[NSDateFormatter alloc] init];
  [style_full setDateStyle : NSDateFormatterFullStyle];
  //打印中国格式的日期信息
  NSLog(@"cn short date : %@", [style_short stringFromDate : date]);
  NSLog(@"cn medium date : %@", [style_medium stringFromDate : date]);
  NSLog(@"cn long date : %@", [style_long stringFromDate : date]);
  NSLog(@"cn full date : %@", [style_full stringFromDate : date]);
  //将四个 NSDateFormatter 设置成美国格式
  [style_short setLocale : en];
  [style_medium setLocale : en];
  [style_long setLocale : en];
  [style_full setLocale : en];
  //打印美国格式的日期字符串
  NSLog(@"en short date : %@", [style_short stringFromDate : date]);
  NSLog(@"en medium date : %@", [style_medium stringFromDate : date]);
  NSLog(@"en long date : %@", [style_long stringFromDate : date]);
  NSLog(@"en full date : %@", [style_full stringFromDate : date]);
  }
}

-- 执行结果 :


localhost:oc_object octopus$ clang -fobjc-arc -framework Foundation OCNSDateFormatterTest.m 
localhost:oc_object octopus$ ./a.out 
2015-10-07 18:54:08.207 a.out[825:507] cn short date : 15-10-7
2015-10-07 18:54:08.209 a.out[825:507] cn medium date : 2015年10月7日
2015-10-07 18:54:08.209 a.out[825:507] cn long date : 2015年10月7日
2015-10-07 18:54:08.210 a.out[825:507] cn full date : 2015年10月7日 星期三
2015-10-07 18:54:08.211 a.out[825:507] en short date : 10/7/15
2015-10-07 18:54:08.212 a.out[825:507] en medium date : Oct 7, 2015
2015-10-07 18:54:08.212 a.out[825:507] en long date : October 7, 2015
2015-10-07 18:54:08.213 a.out[825:507] en full date : Wednesday, October 7, 2015
3. 日历 (NSCalendar) 日期 (NSDateComponents) 组件

(1) 两个类简介

NSCalendar 与 NSDateComponents 简介 :


-- 主要作用 : 月, 日, 年 等数值转化为 NSDate, 从 NSDate 对象中提取 月, 日, 年 数值;


-- NSCalendar 作用 : NSDate 与 NSDateComponents 转化媒介;


-- NSDateComponents 作用 : 专门封装 年月日时分秒 个字段信息, 包含了 year, month, day, hour, minute, second, week, weekday 等 字段的 getter 和 setter 方法;


(2) NSCalendar 常用方法

NSCalendar 常用方法 :


-- NSDate -> 数据 : "(NSDateComponents *) components : FromDate :", 从 NSDate 中提取 年月日时分秒 各个字段数据;


-- 数据 -> NSDate : "dateFromComponents : (NSDateComponents *) comps", 使用 年月日时分秒 数据创建 NSDate;


(3) 获取 NSDate 中数据

NSDate 获取 日期数值数据 :


-- 1.创建 NSCalendar 对象 :


-- 2.获取 NSDateComponents 对象 : 调用 NSCalendar 的 "components : fromDate :" 方法获取 NSDateComponents 对象;


-- 3.获取具体数值 : 调用 NSDateComponents 对象的 getter 方法获取各字段具体数值;


(4) 获取 NSDate 中的数值数据

根据 日志数值数据 创建 NSDate :


-- 1.创建 NSCalendar 对象 :


-- 2.创建 NSDateComponents 对象 : 调用对象的 setter 方法, 将具体的数值设置到字段中去;


-- 3.创建 NSDate 对象 : 调用 NSCalendar 的 "dateFromComponents : (NSDateComponents *)" 初始化 NSDate 对象;


(5) NSCalendar 和 NSDateComponents 示例代码

示例代码 :


//
//  main.m
//  01.Calendar
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建 Calendar 对象
        NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier : NSGregorianCalendar];
        //获取当前日期
        NSDate * date = [NSDate date];
        //指定 NSDateComponents 中含有的字段信息
        unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |
        NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit;
        //获取 NSDateComponents 对象
        NSDateComponents * components = [calendar components:unitFlags fromDate:date];
        //将 NSDateComponents 对象中得字段打印出来
        NSLog(@"%ld 年 %ld 月 %ld 日, %ld 时, %ld 分, %ld 秒, 星期 %ld", components.year, components.month, components.day, components.hour, components.minute, components.second, components.weekday);
        //根据 NSDateComponents 创建 NSDate 对象
        components.year = 3000;
        NSDate * date1 = [calendar dateFromComponents:components];
        NSLog(@"date1 : %@", date1);
    }
}

-- 执行结果 :



         

4. 定时器

(1) 定时器创建

创建定时器 :


-- 两个创建方法 : 调用 NSTimer 的 "scheduledTimeWithTimeInterval : repeats : " 方法, 或者 scheduledTimerWithTimeInterval : target : selector : userInfo : repeats : " 方法;


-- timeInterval 参数 : 指定执行周期, 每隔多少时间执行一次;


-- target 与 selector 参数 : 指定重复执行任务, 如果指定 target 或者 selector 参数, 则指定使用 target 的 selector 方法为执行的任务;


-- Invocation 参数 : 传入一个 NSInvocation 对象, 该 NSInvocation 对象也是封装了一个 target 和 selector;


-- userInfo 参数 : 传入额外的附加信息;


-- repeats 参数 : 指定一个 BOOL 值, 指定是否需要循环执行任务;


(2) 定时器流程

定时器使用流程 :


-- 创建定时器 :


   [NSTimer scheduledTimerWithTimeInterval:0.5

                                    target:self

                                  selector:NSSelectorFromString(@"info:")

                                  userInfo:nil

                                   repeats: YES];

-- 编写任务方法 :


-- 销毁定时器 :


[timer invalidate];



三. 对象拷贝

1. 拷贝方法 copy 与 mutableCopy

(1) 方法简介

拷贝方法简介  :


-- copy 方法 : 复制对象的副本, 一般返回对象不可修改的副本; 假如被复制的对象是可修改的 NSMutableString, 复制后成为 NSString 不可修改;


-- mutableCopy 方法 : 复制对象的可变副本, 返回对象的可变副本; 假如被复制对象不可修改 如 NSString, 使用该方法复制后为 NSMutableString 可以修改;


(2) 示例代码

示例代码 :


//
//  main.m
//  03.Copy
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString * str = @"octopus";
        NSMutableString * str_mutable = [NSMutableString stringWithString:@"octopus"];
        //复制可变字符串
        NSMutableString * str_mutable1 = [str mutableCopy];
        NSMutableString * str_mutable2 = [str_mutable mutableCopy];
        //验证可变字符串
        [str_mutable1 appendString:@" mutable"];
        [str_mutable2 appendString:@" mutable"];
        NSLog(@"str_mutable1 : %@, str_mutable2 : %@", str_mutable1, str_mutable2);
        //复制不可变字符串
        NSString * str1 = [str copy];
        NSMutableString * str2 = [str_mutable copy];
        [str2 appendString:@" mutable"];
        NSLog(@"str_mutable2 : %@", str_mutable2);
    }
    return 0;
}


-- 执行结果 : 后面的复制 不能被修改, 所以报错;


2015-10-08 20:14:57.690 03.Copy[760:303] str_mutable1 : octopus mutable, str_mutable2 : octopus mutable
2015-10-08 20:14:57.692 03.Copy[760:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
*** First throw call stack:
(
  0   CoreFoundation                      0x00007fff8fda225c __exceptionPreprocess + 172
  1   libobjc.A.dylib                     0x00007fff8e6a0e75 objc_exception_throw + 43
  2   CoreFoundation                      0x00007fff8fda210c +[NSException raise:format:] + 204
  3   CoreFoundation                      0x00007fff8fd71dbe mutateError + 110
  4   03.Copy                             0x0000000100000dfc main + 348
  5   libdyld.dylib                       0x00007fff84bb85fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

2. 自定义 拷贝方法

(1) 自定义类拷贝方法

调用 copy 方法前提 :


-- 1.该类实现了 NSCopying 协议;


-- 2.该类实现了 copyWithZone: 方法;


调用 mutableCopy 方法前提 :


-- 1.该类实现了 NSMutableCopying 协议;


-- 2.该类实现了 mutableCopyWithZone 方法;


(2) 代码示例

自定义类赋值代码示例 :


-- OCCat.h :


//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, strong) NSString * name;
@property (assign, nonatomic) int age;
@end

-- OCCat.m :


//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
- (id) copyWithZone : (NSZone *) zone
{
    OCCat * cat = [[[self class] allocWithZone:zone]init];
    cat.name = self.name;
    cat.age = self.age;
    return cat;
}
@end

-- main.m :


//
//  main.m
//  03.Copy
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        OCCat * cat1 = [[OCCat alloc] init];
        cat1.name = [NSMutableString stringWithString:@"Cat One"];
        cat1.age = 18;
        OCCat * cat2 = [cat1 copy];
        cat2.name = [NSMutableString stringWithString:@"Cat Two"];
        cat2.age = 20;
        NSLog(@"cat1.name : %@, cat1.age : %d, cat2.name : %@, cat2.age : %d", cat1.name, cat1.age, cat2.name, cat2.age);
    }
    return 0;
}

-- 执行结果 :


2015-10-08 20:41:08.584 03.Copy[941:303] cat1.name : Cat One, cat1.age : 18, cat2.name : Cat Two, cat2.age : 20

Program ended with exit code: 0

3. 浅复制 深复制

(1) 浅拷贝示例

浅拷贝示例 : 复制 cat2 对象是从 cat1 复制而来, 但是 cat1 中得 name 是一个 NSString * 引用对象, 这两个 cat1 cat2 都指向同一个 name 对象;


-- 修改下之前的 main 函数 :


//
//  main.m
//  03.Copy
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        OCCat * cat1 = [[OCCat alloc] init];
        cat1.name = [NSMutableString stringWithString:@"Cat One"];
        cat1.age = 18;
        OCCat * cat2 = [cat1 copy];
        [(NSMutableString *)cat2.name replaceCharactersInRange:NSMakeRange(0, 7) withString:@"Cat Two"];
        cat2.age = 20;
        NSLog(@"cat1.name : %@, cat1.age : %d, cat2.name : %@, cat2.age : %d", cat1.name, cat1.age, cat2.name, cat2.age);
    }
    return 0;
}

-- 执行结果 :


2015-10-09 17:13:56.329 03.Copy[1744:303] cat1.name : Cat Two, cat1.age : 18, cat2.name : Cat Two, cat2.age : 20

Program ended with exit code: 0

(2) 深拷贝示例

深拷贝完整示例 :


-- OCCat.h : 与之前的相同;


//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, strong) NSString * name;
@property (assign, nonatomic) int age;
@end
-- OCCat.m : 只是在 copyWithZone 方法中, 将 name 赋值 改为 name copy 后赋值;
//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
- (id) copyWithZone : (NSZone *) zone
{
    OCCat * cat = [[[self class] allocWithZone:zone]init];
    cat.name = [self.name mutableCopy];
    cat.age = self.age;
    return cat;
}
@end

-- main.m : 与之前相同;


//
//  main.m
//  03.Copy
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        OCCat * cat1 = [[OCCat alloc] init];
        cat1.name = [NSMutableString stringWithString:@"Cat One"];
        cat1.age = 18;
        OCCat * cat2 = [cat1 copy];
        [(NSMutableString *)cat2.name replaceCharactersInRange:NSMakeRange(0, 7) withString:@"Cat Two"];
        cat2.age = 20;
        NSLog(@"cat1.name : %@, cat1.age : %d, cat2.name : %@, cat2.age : %d", cat1.name, cat1.age, cat2.name, cat2.age);
    }
    return 0;
}

-- 执行结果 :


2015-10-09 17:27:22.302 03.Copy[1809:303] cat1.name : Cat One, cat1.age : 18, cat2.name : Cat Two, cat2.age : 20
Program ended with exit code: 0
4. setter 的 copy 参数

(1) copy 参数

copy 参数用处 :


-- 示例 :


@property (nonatomic, copy) NSMutableString * name;

-- 作用 : 为 name 属性 赋值时, 将赋值对象 copy 一份, 将副本赋值给 name 属性;


-- 使用 copy 指令, 相当于将 setter 方法设置成如下状态 :


- (void) setName:(NSMutableString *)name1

{

   this.name = [name1 copy];

}

(2) copy 参数示例

copy 代码错误使用示例 : copy 的属性, 赋值后 是不可变的, 如 NSMutableString 接收一个 NSString 赋值, 如果在对赋值后的属性执行 NSMutableString 的操作, 就会报错;


-- OCCat.h :


//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, copy) NSMutableString * name;
@property (assign, nonatomic) int age;
@end
-- OCCat.m : 
//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
@end
-- main.h :
//
//  main.m
//  03.Copy
//
//  Created by octopus on 15-10-8.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        OCCat * cat1 = [[OCCat alloc] init];
        cat1.name = [NSMutableString stringWithString:@"Cat One"];
        cat1.age = 18;
        [cat1.name appendString:@" append"];
    }
    return 0;
}
-- 执行结果 : 
2015-10-09 23:17:01.469 03.Copy[2095:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
*** First throw call stack:
(
  0   CoreFoundation                      0x00007fff8fda225c __exceptionPreprocess + 172
  1   libobjc.A.dylib                     0x00007fff8e6a0e75 objc_exception_throw + 43
  2   CoreFoundation                      0x00007fff8fda210c +[NSException raise:format:] + 204
  3   CoreFoundation                      0x00007fff8fd71dbe mutateError + 110
  4   03.Copy                             0x0000000100000d86 main + 246
  5   libdyld.dylib                       0x00007fff84bb85fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
四. NSArray NSMutableArray 数组集合
Objective-C 集合概述 : 
-- NSArray : 有序, 可重复集合;
-- NSSet : 无序, 不可重复集合;
-- NSDictionary : 有映射关系的集合;
1. NSArray 基本功能用法
(1) NSArray 创建
NSArray 简介 : 有序, 可重复集合;
-- 特点 : 每个元素都有对应的顺序索引, 允许重复元素, 通过索引来访问指定位置元素, 索引从 0 开始;
NSArray 对象创建 : 
-- "array" 方法 : 创建空得 NSArray 对象;
-- "arrayWithContentsOfFile : " 方法 : 读取文件内容创建 NSArray 对象;
-- "initWithContentsOfFile : " 方法 :  读取文件内容创建 NSArray 对象;
-- "arrayWithObject : " 方法 : 创建只包含单个元素的 NSArray 对象;
-- "initWithObject : " 方法 : 创建只包含单个元素的 NSArray 对象;
-- "arrayWithObjects : " 方法 : 创建包含 N 个元素的 NSArray 对象, 最后一个 nil 元素, 表示 NSArray 集合结束;
NSArray * array = [NSArray arrayWithObjects:@"Smoke", @"Drink", @"Perm", nil];
-- "initWithObjects : " 方法 : 创建包含 N 个元素的 NSArray 对象;
(2) NSArray 基本方法
NSArray 集合主要方法 : 
-- 查索引 : 查询集合元素在 NSArray 中索引;
        //获取元素在集合中得位置
        NSLog(@"Index Of Drink at subArray is : %ld", [subArray indexOfObject:@"Drink"]);
        NSLog(@"Index Of Drink at array is : %ld", [array indexOfObject:@"Drink" inRange:NSMakeRange(1, 2)]);
-- 查元素 : 根据索引值 取出 NSArray 集合中得元素;
        // 获取 第 0 1 最后一个元素 并打印
        NSLog(@"First : %@", [array objectAtIndex:0]);
        NSLog(@"Second : %@", [array objectAtIndex:1]);
        NSLog(@"Last : %@", [array lastObject]);
-- 整体调用 : 对集合元素整体调用的方法;
-- 排序 : 对 NSArray 集合进行排序;
-- 截取元素 : 取出 NSArray 部分元素组成新集合;
        //截取 1 2 个元素组成新 NSArray 集合对象
        NSArray * subArray = [array objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];
-- 追加元单个素 : "arrayByAddingObject : " 追加单个元素;
array = [array arrayByAddingObject:@"Run"];
-- 追加数组 : "arrayWithObjects : " 追加一个数组;
array = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"Jump", @"Fuck", nil]];
(3) NSArray 基本方法 示例代码
示例代码 : 
-- OCCat.h : 
//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic, assign) int age;
- (id) initWithName : (NSString *) _name age : (int) _age;
- (void) purr : (NSString *) content;
@end
-- OCCat.m : 
//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
- (id) initWithName:(NSString *)_name age:(int)_age
{
    self = [super init];
    self.name = _name;
    self.age = _age;
    return self;
}
- (void) purr:(NSString *)content
{
    NSLog(@"cat name : %@, age %d is purr", self.name, self.age);
}
- (BOOL) isEqual : (id) other
{
    //如果地址相同, 那么比较结果肯定相同
    if(self == other)
    {
        return YES;
    }
    //对象对比之前首先保证类型相同
    if([other class] == OCCat.class)
    {
        OCCat * cat = (OCCat *)other;
        return [self.name isEqualToString:cat.name] && (self.age == cat.age);
    }
    return NO;
}
//%@ 打印的时候输出的内容
- (NSString *) description
{
    return [NSString stringWithFormat:@"<OCCat [name = %@, age = %d]>", self.name, self.age];
}
@end
-- main.m : 
//
//  main.m
//  04.NSArray
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建 NSArray 对象
        NSArray * array = [NSArray arrayWithObjects:@"Smoke", @"Drink", @"Perm", nil];
        // 获取 第 0 1 最后一个元素 并打印
        NSLog(@"First : %@", [array objectAtIndex:0]);
        NSLog(@"Second : %@", [array objectAtIndex:1]);
        NSLog(@"Third: %@", array[2]);
        NSLog(@"Last : %@", [array lastObject]);
        // 打印整个 array
        NSLog(@"array : \n%@", array);
        //截取 1 2 个元素组成新 NSArray 集合对象, NSIndexSet 集合用于保存索引值
        NSArray * subArray = [array objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];
        //获取元素在集合中得位置
        NSLog(@"Index Of Drink at subArray is : %ld", [subArray indexOfObject:@"Drink"]);
        NSLog(@"Index Of Drink at array is : %ld", [array indexOfObject:@"Drink" inRange:NSMakeRange(1, 2)]);
        //添加单个元素
        array = [array arrayByAddingObject:@"Run"];
        //追加一个 NSArray 集合, nil 结尾表示 NSArray 结束
        array = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"Jump", @"Fuck", nil]];
        //遍历 array
        for (int i = 0; i < array.count; i ++) {
            NSLog(@"array %d : %@", i, [array objectAtIndex:i]);
        }
        //将字符串写出到文件中
        [array writeToFile:@"array.txt" atomically:YES];
        //创建 OCCat 的 array
        NSArray * array2 = [NSArray arrayWithObjects:
                            [[OCCat alloc] initWithName : @"Tom" age : 18],
                            [[OCCat alloc] initWithName : @"Jerry" age : 20],
                            nil];
        //打印 array, 验证 重写的 description 方法
        NSLog(@"array2 is : \n%@", array2);
        OCCat* cat = [[OCCat alloc] initWithName : @"Tom" age : 18];
        //获取 元素 在 array 中的位置, 验证 isEqual 方法
        NSUInteger index = [array2 indexOfObject:cat];
        NSLog(@"index Of Tom is : %ld", index);
    }
    return 0;
}
-- 执行结果 : 
2015-10-14 17:16:12.748 04.NSArray[7155:303] First : Smoke
2015-10-14 17:16:12.750 04.NSArray[7155:303] Second : Drink
2015-10-14 17:16:12.751 04.NSArray[7155:303] Third: Perm
2015-10-14 17:16:12.751 04.NSArray[7155:303] Last : Perm
2015-10-14 17:16:12.751 04.NSArray[7155:303] array : 
(
    Smoke,
    Drink,
    Perm
)
2015-10-14 17:16:12.752 04.NSArray[7155:303] Index Of Drink at subArray is : 0
2015-10-14 17:16:12.752 04.NSArray[7155:303] Index Of Drink at array is : 1
2015-10-14 17:16:12.753 04.NSArray[7155:303] array 0 : Smoke
2015-10-14 17:16:12.753 04.NSArray[7155:303] array 1 : Drink
2015-10-14 17:16:12.753 04.NSArray[7155:303] array 2 : Perm
2015-10-14 17:16:12.754 04.NSArray[7155:303] array 3 : Run
2015-10-14 17:16:12.754 04.NSArray[7155:303] array 4 : Jump
2015-10-14 17:16:12.755 04.NSArray[7155:303] array 5 : Fuck
2015-10-14 17:16:12.769 04.NSArray[7155:303] array2 is : 
(
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>"
)
2015-10-14 17:16:12.769 04.NSArray[7155:303] index Of Tom is : 0
Program ended with exit code: 0
2. NSArray 集合整体调用
(1) NSArray 整体元素调用简介
调用所有元素方法 : 
-- "makeObjectPerformSelector : " 方法 : 按顺序 依次 调用 NSArray 中集合的每个元素, 需要传入 SEL 参数, 该参数指定需要调用的方法;
-- "makeObjectPerformSelector : withObject : " 方法 : 参数一 SEL 代表的方法, 参数二 方法的参数, 参数三 控制是否终止迭代;
-- "enumerateObjectsUsingBlock : " 方法 : 遍历集合中元素, 使用 集合中的元素 执行指定代码块;
-- "enumerateObjectsWithOptions : usingBlock : " 方法 : 遍历元素, 依次使用元素执行代码块, 可以额外传入一个参数控制遍历选项;
-- "enumerateObjectsAtIndexs : options : usingBlock : " 方法 : 遍历指定范围元素, 依次使用元素执行代码块, 传入最后的参数用于控制遍历; 
(2) NSArray 整体元素调用代码示例
代码示例 : 
-- OCCat.h : 
//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic, assign) int age;
- (id) initWithName : (NSString *) _name age : (int) _age;
- (void) purr : (NSString *) content;
@end
-- OCCat.m : 
//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
- (id) initWithName:(NSString *)_name age:(int)_age
{
    self = [super init];
    self.name = _name;
    self.age = _age;
    return self;
}
- (void) purr:(NSString *)content
{
    NSLog(@"cat name : %@, age %d is purr", self.name, self.age);
}
- (BOOL) isEqual : (id) other
{
    //如果地址相同, 那么比较结果肯定相同
    if(self == other)
    {
        return YES;
    }
    //对象对比之前首先保证类型相同
    if([other class] == OCCat.class)
    {
        OCCat * cat = (OCCat *)other;
        return [self.name isEqualToString:cat.name] && (self.age == cat.age);
    }
    return NO;
}
//%@ 打印的时候输出的内容
- (NSString *) description
{
    return [NSString stringWithFormat:@"<OCCat [name = %@, age = %d]>", self.name, self.age];
}
@end
-- main.m : 
//
//  main.m
//  04.NSArray
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建 OCCat 的 array
        NSArray * array = [NSArray arrayWithObjects:
                            [[OCCat alloc] initWithName : @"Tom" age : 18],
                            [[OCCat alloc] initWithName : @"Jerry" age : 20],
                            nil];
        NSLog(@"array is : \n%@", array);
        [array makeObjectsPerformSelector:@selector(purr:) withObject:@" FUCK YOU "];
    }
    return 0;
}
-- 执行结果 : 
2015-10-15 10:50:49.902 04.NSArray[8086:303] array is : 
(
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>"
)
2015-10-15 10:50:49.905 04.NSArray[8086:303] cat name : Tom, age 18 is purr
2015-10-15 10:50:49.905 04.NSArray[8086:303] cat name : Jerry, age 20 is purr
Program ended with exit code: 0
3. NSArray 排序
(1) NSArray 排序简介
NSArray 排序 : 
-- "sortArrayUsingFunction : context : " 方法 : 使用排序函数对集合进行排序, 函数会返回 NSOrderedDescending, NSOrderedAscending, NSOrderedSame 枚举值, 同时会返回一个 排序号的 NSArray 集合;
-- "sortArrayUsingSelector : " 方法 : 使用集合元素自身的方法对集合进行排序, 该方法返回 NSOrderedDescending, NSOrderedAscending, NSOrderedSame 枚举值, 同时还会返回一个 排序号的 NSArray 集合;
-- "sortArrayUsingComparator : " 方法 : 使用代码块对集合进行排序, 代码块 返回 NSOrderedDescending, NSOrderedAscending, NSOrderedSame 枚举值, 同时返回排序号的 NSArray 集合;
(2) NSArray 排序代码示例
NSArray 排序示例代码 : 
-- main.c : 
//
//  main.m
//  04.NSArray
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
NSInteger intSort(id num1, id num2, void * context)
{
    int v1 = [num1 intValue];
    int v2 = [num2 intValue];
    if(v1 < v2)
    {
        return NSOrderedAscending;
    }
    if(v1 > v2)
    {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建一个 NSarray 集合, 其中放置 NSString 元素
        NSArray * array = [NSArray arrayWithObjects:@"Tom", @"Jerry", @"Fuck", nil];
        NSLog(@"array : \n%@\n", array);
        //使用 compare 方法进行排序
        array = [array sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"array sort : \n%@\n", array);
        //创建一个 NSNumber 元素的 NSarray 集合
        NSArray * array_num = [NSArray arrayWithObjects:
                               [NSNumber numberWithInt:18],
                               [NSNumber numberWithInt:16],
                               [NSNumber numberWithInt:20],
                               [NSNumber numberWithInt:-1],
                               nil];
        NSLog(@"array_num : \n%@\n", array_num);
        //使用 intSort 方法进行排序
        array_num = [array_num sortedArrayUsingFunction:intSort context:nil];
        NSLog(@"array_num sort : \n%@\n", array_num);
        //使用代码块进行排序
        array_num = [array_num sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
        {
            if([obj2 intValue] < [obj1 intValue])
            {
                return NSOrderedAscending;
            }
            if([obj2 intValue] > [obj1 intValue])
            {
                return NSOrderedDescending;
            }
            return NSOrderedSame;
        }];
        NSLog(@"array_num : \n%@\n", array_num);
    }
    return 0;
}


-- 执行结果 :


2015-10-15 11:52:51.335 04.NSArray[8465:303] array : 
(
    Tom,
    Jerry,
    Fuck
)
2015-10-15 11:52:51.336 04.NSArray[8465:303] array sort : 
(
    Fuck,
    Jerry,
    Tom
)
2015-10-15 11:52:51.337 04.NSArray[8465:303] array_num : 
(
    18,
    16,
    20,
    "-1"
)
2015-10-15 11:52:51.337 04.NSArray[8465:303] array_num sort : 
(
    "-1",
    16,
    18,
    20
)
2015-10-15 11:52:51.338 04.NSArray[8465:303] array_num : 
(
    20,
    18,
    16,
    "-1"
)
Program ended with exit code: 0


4. NSArray 枚举器遍历

(1) NSArray 获取枚举器

NSArray 枚举器 NSEnumerator 简介 :


-- "objectEnumerator : " 方法 : 返回 NSArray 集合顺序枚举器;


-- "reverseObjectEnumerator : "  方法 : 返回 NSArray 集合的逆序枚举器;


(2) NSEnumerator 枚举器

NSEnumerator 方法简介 :


-- "allObjects : " 方法 : 获取集合中的所有元素;


-- "nextObjects : " 方法 : 获取集合中的下一个元素;


(3) NSEnumerator 枚举器示例代码

NSEnumerator 示例代码 :


-- main.m 代码 :


//

//  main.m

//  04.NSArray

//

//  Created by octopus on 15-10-13.

//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.

//

#import "OCCat.h"

int main(int argc, const char * argv[])

{

   @autoreleasepool {

     

       //创建一个 NSarray 集合, 其中放置 NSString 元素

       NSArray * array = [NSArray arrayWithObjects:@"Tom", @"Jerry", @"Fuck", nil];

       NSLog(@"array : \n%@\n", array);

     

       //顺序枚举

       NSEnumerator * enumerator = [array objectEnumerator];

       id object;

       while (object = [enumerator nextObject]) {

           NSLog(@"%@", object);

       }

     

       NSLog(@"\n");

     

       //逆序枚举

       NSEnumerator * reverseEnumerator = [array reverseObjectEnumerator];

       while (object = [reverseEnumerator nextObject]) {

           NSLog(@"%@", object);

       }

     

     

   }

   return 0;

}


-- 执行结果 :


2015-10-15 12:09:59.170 04.NSArray[8590:303] array :

(

   Tom,

   Jerry,

   Fuck

)

2015-10-15 12:09:59.176 04.NSArray[8590:303] Tom

2015-10-15 12:09:59.177 04.NSArray[8590:303] Jerry

2015-10-15 12:09:59.177 04.NSArray[8590:303] Fuck

2015-10-15 12:09:59.178 04.NSArray[8590:303]

2015-10-15 12:09:59.178 04.NSArray[8590:303] Fuck

2015-10-15 12:09:59.178 04.NSArray[8590:303] Jerry

2015-10-15 12:09:59.179 04.NSArray[8590:303] Tom

Program ended with exit code: 0

5. NSArray 快速枚举

(1) NSArray 快速枚举

快速枚举简介 : 快速枚举无需获取集合长度, 也不用根据索引访问集合元素;


-- 语法 :


for (id object in array)

{

//对 object 进行操作

}

(2) NSArray 快速枚举示例

NSArray 快速枚举示例 :


-- main.m :


//
//  main.m
//  04.NSArray
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建一个 NSarray 集合, 其中放置 NSString 元素
        NSArray * array = [NSArray arrayWithObjects:@"Tom", @"Jerry", @"Fuck", nil];
        NSLog(@"array : \n%@\n", array);
        //快速枚举
        for(id object in array)
        {
            NSLog(@"%@", object);
        }
    }
    return 0;
}


-- 执行结果 :


2015-10-15 12:17:36.096 04.NSArray[8642:303] array : 
(
    Tom,
    Jerry,
    Fuck
)
2015-10-15 12:17:36.098 04.NSArray[8642:303] Tom
2015-10-15 12:17:36.098 04.NSArray[8642:303] Jerry
2015-10-15 12:17:36.099 04.NSArray[8642:303] Fuck
Program ended with exit code: 0
6. NSMutableArray 可变数组
(1) NSMutableArray 简介
NSMutableArray 简介 : 
-- NSMutableArray 与 NSArray 对比 : NSArray 是不可变数组, 一旦创建不能增删替换元素, NSMutableArray 可以随时增加 删除 替换 元素;
-- "addXX" 方法 : 添加集合元素的方法;
-- "removeXX" 方法 : 删除集合元素的方法;
-- "replaceXX" 方法 : 替换集合元素的方法;
-- "sortXX" 方法 : 对集合本身排序的方法; 
(2) NSMutableArray 代码示例
NSMutableArray 代码示例 : 
-- OCCat.h : 
//
//  OCCat.h
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface OCCat : NSObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic, assign) int age;
- (id) initWithName : (NSString *) _name age : (int) _age;
- (void) purr : (NSString *) content;
@end
-- OCCat.m : 
//
//  OCCat.m
//  octopus
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
@implementation OCCat
@synthesize name;
@synthesize age;
- (id) initWithName:(NSString *)_name age:(int)_age
{
    self = [super init];
    self.name = _name;
    self.age = _age;
    return self;
}
- (void) purr:(NSString *)content
{
    NSLog(@"cat name : %@, age %d is purr", self.name, self.age);
}
- (BOOL) isEqual : (id) other
{
    //如果地址相同, 那么比较结果肯定相同
    if(self == other)
    {
        return YES;
    }
    //对象对比之前首先保证类型相同
    if([other class] == OCCat.class)
    {
        OCCat * cat = (OCCat *)other;
        return [self.name isEqualToString:cat.name] && (self.age == cat.age);
    }
    return NO;
}
//%@ 打印的时候输出的内容
- (NSString *) description
{
    return [NSString stringWithFormat:@"<OCCat [name = %@, age = %d]>", self.name, self.age];
}
@end
-- main.m : 
//
//  main.m
//  04.NSArray
//
//  Created by octopus on 15-10-13.
//  Copyright (c) 2015年 www.octopus.org.cn. All rights reserved.
//
#import "OCCat.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSMutableArray * array = [NSMutableArray arrayWithObjects:
                                  [[OCCat alloc] initWithName : @"Tom" age : 18],
                                  [[OCCat alloc] initWithName : @"Jerry" age: 20],
                                  [[OCCat alloc] initWithName : @"Jay" age : 180],
                                  nil];
        NSLog(@"array 原始数组 : \n%@\n", array);
        //添加单个元素
        [array addObject:[[OCCat alloc] initWithName:@"octopus" age:26]];
        NSLog(@"array 追加单个元素 : \n%@\n", array);
        //添加数组
        [array addObjectsFromArray:[NSArray arrayWithObjects:
                                    [[OCCat alloc] initWithName:@"HanShuliang" age:26],
                                    [[OCCat alloc] initWithName:@"Bill" age:60],
                                    nil]];
        NSLog(@"array 追加集合 : \n%@\n", array);
        //插入单个元素
        [array insertObject : [[OCCat alloc] initWithName:@"Green" age:26] atIndex:0];
        NSLog(@"array 插入单个元素 : \n%@\n", array);
        //插入集合
        [array insertObjects: [NSArray arrayWithObjects:
                                    [[OCCat alloc] initWithName:@"LiKeqiang" age:26],
                                    [[OCCat alloc] initWithName:@"Son" age:60],
                                    nil]
                   atIndexes: [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)]];
        NSLog(@"array 插入集合 : \n%@\n", array);
        //删除最后一个元素
        [array removeLastObject];
        NSLog(@"array 删除最后一个元素 : \n%@\n", array);
        //删除第3个元素
        [array removeObjectAtIndex:3];
        NSLog(@"array 删除第三个元素 : \n%@\n", array);
        //删除第3,4个元素
        [array removeObjectsInRange:NSMakeRange(3, 2)];
        NSLog(@"array 删除第3,4个元素 : \n%@\n", array);
        //替换第0个元素
        [array replaceObjectAtIndex:0 withObject:[[OCCat alloc] initWithName:@"HanShuliang" age:28]];
        NSLog(@"array 替换第0个元素 : \n%@\n", array);
    }
    return 0;
}


-- 执行结果 :


2015-10-15 12:51:43.749 04.NSArray[9033:303] array 原始数组 : 
(
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>"
)
2015-10-15 12:51:43.752 04.NSArray[9033:303] array 追加单个元素 : 
(
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>"
)
2015-10-15 12:51:43.752 04.NSArray[9033:303] array 追加集合 : 
(
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>",
    "<OCCat [name = Bill, age = 60]>"
)
2015-10-15 12:51:43.753 04.NSArray[9033:303] array 插入单个元素 : 
(
    "<OCCat [name = Green, age = 26]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>",
    "<OCCat [name = Bill, age = 60]>"
)
2015-10-15 12:51:43.753 04.NSArray[9033:303] array 插入集合 : 
(
    "<OCCat [name = Green, age = 26]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = LiKeqiang, age = 26]>",
    "<OCCat [name = Son, age = 60]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>",
    "<OCCat [name = Bill, age = 60]>"
)
2015-10-15 12:51:43.755 04.NSArray[9033:303] array 删除最后一个元素 : 
(
    "<OCCat [name = Green, age = 26]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = LiKeqiang, age = 26]>",
    "<OCCat [name = Son, age = 60]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>"
)
2015-10-15 12:51:43.756 04.NSArray[9033:303] array 删除第三个元素 : 
(
    "<OCCat [name = Green, age = 26]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = LiKeqiang, age = 26]>",
    "<OCCat [name = Jerry, age = 20]>",
    "<OCCat [name = Jay, age = 180]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>"
)
2015-10-15 12:51:43.757 04.NSArray[9033:303] array 删除第3,4个元素 : 
(
    "<OCCat [name = Green, age = 26]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = LiKeqiang, age = 26]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>"
)
2015-10-15 12:51:43.757 04.NSArray[9033:303] array 替换第0个元素 : 
(
    "<OCCat [name = HanShuliang, age = 28]>",
    "<OCCat [name = Tom, age = 18]>",
    "<OCCat [name = LiKeqiang, age = 26]>",
    "<OCCat [name = octopus, age = 26]>",
    "<OCCat [name = HanShuliang, age = 26]>"
)
Program ended with exit code: 0



目录
相关文章
|
21天前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
126 2
|
21天前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
19 2
|
21天前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
86 0
|
11月前
|
Android开发 iOS开发
iOS 一个类似安卓的日期选择器
在iOS的app上一般的日期选择器都会选择用 UIDatePicker 来做,但是我之前的产品经理并不喜欢那种选择的模式。说事要统一安卓和iOS的设计风格。这就是我写这个选择器的初衷。
|
编译器 API iOS开发
iOS 代码规范格式 Objective-C(下)
iOS 代码规范格式 Objective-C(下)
198 0
|
iOS开发 容器
iOS 代码规范格式 Objective-C(上)
iOS 代码规范格式 Objective-C
386 0
iOS 代码规范格式 Objective-C(上)
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
221 0
|
iOS开发
ios获取系统当前日期,一定日期格式的代码
<p class="p1" style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> <span class="s1">NSDate</span> *  senddate=[<span class="s1">NSDate</span> <span class="s2">date</s
1502 0
|
5天前
|
编解码 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【5月更文挑战第31天】本文将深入探讨SwiftUI框架,这是Apple为iOS应用开发推出的最新用户界面工具包。我们将分析其核心概念、优势以及如何利用SwiftUI简化和加速开发流程,同时也会触及一些常见的挑战和解决方案。
|
21天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比