本文主要是介绍OC语言之NSArray的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
# NSArray基本概念
##1.NSArray的基本概念
- 什么是NSArray?
+NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
+C语言中数组的弊端
* int array[4] = {10, 89, 27, 76};
* 只能存放一种类型的数据.(类型必须一致)
* 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)
- NSArray的使用注意
+只能存放任意OC对象, 并且是有顺序的
+不能存储非OC对象, 比如int\float\double\char\enum\struct等
+它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
---
##2.NSArray的创建方式
- \+ (instancetype)array;
- \+(instancetype)arrayWithObject:(id)anObject;
- \+ (instancetype)arrayWithObjects:(id)firstObj,...;
- \+ (instancetype)arrayWithArray:(NSArray*)array;
- \+ (id)arrayWithContentsOfFile:(NSString*)path;
- \+ (id)arrayWithContentsOfURL:(NSURL*)url;
---
##3.NSArray 的使用注意事项
- NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。
- NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。
```
NSArray *arr = [NSArray arrayWithObjects:@"lnj", nil,@"lmj",@"jjj", nil];
NSLog(@"%@", arr);
输出结果:
(
lnj
)
---
##4.NSArray的常用方法
- \- (NSUInteger)count;
+获取集合元素个数
- \- (id)objectAtIndex:(NSUInteger)index;
+获得index位置的元素
- \- (BOOL)containsObject:(id)anObject;
+是否包含某一个元素
- \- (id)lastObject;
+返回最后一个元素
- \- (id)firstObject;
+返回最后一个元素
- \-(NSUInteger)indexOfObject:(id)anObject;
+查找anObject元素在数组中的位置(如果找不到,返回-1)
- \- (NSUInteger)indexOfObject:(id)anObjectinRange:(NSRange)range;
+在range范围内查找anObject元素在数组中的位置
---
##5.NSArray的简写形式
- 自从2012年开始, Xcode的编译器多了很多自动生成代码的功能, 使得OC代码更加精简
- 数组的创建
+之前
```
[NSArrayarrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
```
+现在
```
@[@"Jack", @"Rose",@"Jim"];
```
- 数组元素的访问
+之前
```
[array objectAtIndex:0];
```
+现在
```
array[0];
---
# 常见的结构体
##1.NSPoint和CGPoint
- CGPoint和NSPoint是同义的
```
typedef CGPoint NSPoint;
CGPoint的定义
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
```
- CGPoint代表的是二维平面中的一个点
+可以使用CGPointMake和NSMakePoint函数创建CGPoint
---
##2.NSSize和CGSize
- CGSize和NSSize是同义的
```
typedef CGSize NSSize;
CGSize的定义
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
```
- CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
+可以使用CGSizeMake和NSMakeSize函数创建CGSize
---
##3.NSRect和CGRect
- CGRect和NSRect是同义的
```
typedef CGRect NSRect;
CGRect的定义
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
```
- CGRect代表的是二维平面中的某个物体的位置和尺寸
+可以使用CGRectMake和NSMakeRect函数创建CGRect
##4.常见的结构体使用注意
- 苹果官方推荐使用CG开头的:
+CGPoint
+CGSize
+CGRect
----
# 集合对象的内存管理
##1.集合对象的内存管理
- 当一个对象加入到集合中,那么该对象的引用计数会+1
- 当集合被销毁的时候,集合会向集合中的元素发送release消息
```
NSMutableArray *arr = [[NSMutableArray alloc] init];
Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr addObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[p release];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr release];
```
- 当一个对象加入到集合中,那么该对象的引用计数会+1
- 当把一个对象从集合中移除时,会向移除的元素发送release消息
```
NSMutableArray *arr = [[NSMutableArray alloc] init];
Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr addObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[arr removeObject:p];
NSLog(@"retainCount = %lu", [p retainCount]);
[p release];
[arr release];
```
##2.集合对象内存管理总结
- 1.官方内存管理原则
+1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease
+2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
- 2.集合的内存管理细节
+1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
+2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1
+3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
- 3.普遍规律
+1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1
+2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
---
# NSArray排序
##1.NSArray排序
- Foundation自带类排序
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *newArr = [arrsortedArrayUsingSelector:@selector(compare:)];
```
- 自定义类排序
NSArray *arr = @[p1, p2, p3, p4, p5];
// 默认按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrentusingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
return obj1.age > obj2.age;
}];
NSLog(@"%@",newArr);
# NSArray文件读写
##1.NSArray数据写入到文件中
```
NSArray *arr = @[@"lnj", @"lmj", @"jjj",@"xcq"];
BOOL flag = [arrwriteToFile:@"/Users/LNJ/Desktop/persons.plist" atomically:YES];
NSLog(@"%i", flag);
---
##2.从文件中读取数据到NSArray中
```
NSArray *newArr = [NSArrayarrayWithContentsOfFile:@"/Users/LNJ/Desktop/persons.xml"];
NSLog(@"%@", newArr);
```
# 自定义的类实现copy操作
##1.自定义类实现copy操作
- 让类遵守NSCopying协议
- 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可。
- 在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致, 并返回该对象.
+>zone: 表示空间,分配对象是需要内存空间的,如果指定了zone,就可以指定新建对象对应的内存空间。但是:zone是一个非常古老的技术,为了避免在堆中出现内存碎片而使用的。在今天的开发中,zone几乎可以忽略
- 无父类实现
```
-(id)copyWithZone(NSZone*)zone{
CustomMode *custom = [[[self class] copyWithZone:zone] init];
Custom ->_a = [_a copyWithZone:zone];
Custom -> _c = _c;//不是对象的直接赋值
Return custom;
}
```
- 有父类实现
+不调用父类方法, 无法拷贝父类中继承的属性
+不重新父类copyWithZone, 无法拷贝本来中的特有属性
```
-(id)copyWithZone(NSZone*)zone{
CustomModel *custom = [super copyWithZone:zone];
….
Return custom;
}
```
# 单例设计模式
##1.单例模式概念
- 什么是单例模式:(Singleton)
+单例模式的意图是是的类的对象成为系统中唯一的实例,
这篇关于OC语言之NSArray的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!