Foundation
框架是其他所有iOS框架的基礎(chǔ)
- 包含了很多開發(fā)中常用的數(shù)據(jù)類型
- 結(jié)構(gòu)體
- 枚舉
- 類
- 要想使用
Foundation
中的數(shù)據(jù)類型,包含它的主文件
即可#import <Foundation/Foundation.h>
1. 結(jié)構(gòu)體 常用 NSRange
CGPoint
CGSize
CGRect
NSRange
typedef struct _NSRange{
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange r = {2, 3}; // 不用
NSRange r2 = {.location = 2, .length = 3}; // 不用
NSRange r3 = NSMakeRange{2, 3}; // 掌握 !s厦伞!
NSString *str = @"VampireJune";
// 查找某個(gè)字符串在 str 中的范圍
// 如果找不到辟宗,length = 0则剃,location = NSNotFound == -1
NSRange r4 = [str rangeOfString:@"June"];
NSLog(@"loc = %ld, len = %ld", r4.location, r4.length);
-
NSPoint
==CGPoint
(跨平臺的(Mac 和 iOS),只用這個(gè)) 表示一個(gè)點(diǎn)的位置
struct CGPoint{
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
CGPoint p = NSMakePoint(10, 10);
// 最常用的方法 CGPointMake
NSPoint p1 = CGPointMake(20, 20);
// 表示原點(diǎn)
CGPointZero == CGPointMake(0, 0);
// 還有 CGSizeZero挎挖, CGRectZero
// 使用這些函數(shù)的前提是添加 CoreGraphics 框架
// 比較兩個(gè)點(diǎn)是否相同 (x, y)
BOOL B = CGPointEqualToPoint(CGPointMake(20, 20),CGPointMake(20, 20))
// 還有 CGSizeEqualToSize,CGRectEqualToRect
-
NSSize
==CGSize
表示UI元素尺寸
NSSize s = CGSizeMake(20, 20);
NSSize s1 = NSMakeSize(20, 20);
CGSize s2 = NSMakeSize(20, 20);
struct CGSize{
CGFloat width;
CGFloat height;
}
typedef struct CGSize CGSize;
-
NSRect
==CGRect
代表二維平面中的某個(gè)物體的位置和尺寸
struct CGRect{
CGPoint origin;
CGSize size;
};
CGRect r1 = CGRectMake(0, 0, 100, 20);
// 超麻煩
NSLog(@"x = %f, y = %f, width = %f, height = %f",
r1.origin.x, r1.origin.y, r1.size.width, r1.size.height);
// 將結(jié)構(gòu)體轉(zhuǎn)為字符串
// NSString *st = NSStringFromRect(r1);
NSLog(@"%@",st);
// 還有NSStringFromPoint, NSStringFromSize
CGRect myRect (CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
CGRect rect;
rect.origin.x = x;
rect.origin.y = y;
rect.size.width = width;
rect.size.height = height;
return rect;
}
// 多種寫法
CGRect r2 = {{0, 0}, {100, 20});
CGRect r3 = {p, s);
CGRect r3 = {CGPointZero, CGPointMake(20, 20)};
// 使用這個(gè)函數(shù)的前提是添加 CoreGraphics 框架
// 判斷一個(gè)矩形范圍是否包含坐標(biāo)20 ,20的點(diǎn)
CGRectContainsPoint(CGRectMake(0, 0, 100, 20),CGPointMake(20, 20));
2. 常用類 NSString
NSArray
NSSet
NSDictionary
NSDate
NSObject
NSString
NSString : 不可變字符串
NSMutableString : 可變字符串
NSString *s1 = @"VampireJune";
NSString *2 = [[NSString alloc] initWithFormat:@"is %d",10];
// 類方法創(chuàng)建 字符串
[NSString stringWithFormat:@"is %d",10];
// C字符串 --> OC字符串
NSString *s3 = [[NSString alloc] initWithUTF8String:"VampireJune"];
// OC字符串 --> C字符串
const char *cs = [s3 UTF8String];
// 從文件中讀取字符串
// NSUTF8StringEncoding 用到中文就可以用這種編碼
NSString *s4 = [[NSString alloc] initWithContentsOfFile:"/絕對路徑" encoding:NSUTF8StringEncoding error:nil];
// URL : 資源路徑
// 協(xié)議頭 : //路徑(file://、ftp://)
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop....."];
// 類方法
[NSURL urlWithString:@"file:///Users/apple/Desktop....."];
// 省去了協(xié)議頭
[NSURL fileURLWithPath:@"/Users/apple/Desktop....."];
NSString *s5 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
// 一般都會有一個(gè)類方法跟對象方法配對
// 字符串導(dǎo)出到文件
// atomically : 原子性操作谎仲,
* YES,當(dāng)文件寫了部分失敗了艺智,這個(gè)文件不會創(chuàng)建
* NO ,當(dāng)文件寫了部分失敗了,這個(gè)文件還會創(chuàng)建
[@"Vampire\nJune" writeToFile:@"文件路徑" atomically:YES encoding:NSUTF8StringEncoding error:nil];
// 不可變字符串后拼接一個(gè)字符串夭问,返回一個(gè)新字符串對象
NSString *s6 = [NSString stringByAppendingString:@"..."];
-
NSMutableString
可變
字符串 繼承自NSString
// 拼接內(nèi)容到 s1 的后面
[s1 appendString:@"..."];
// 刪除 Range 的內(nèi)容 VampireJune
NSRange ra = [s1 rangeOfString:@"VampireJune"];
[s1 deleteCharactersInRange: ra];
3. 集合類 NSArray
NSSet
NSDictionary
NSArray
// OC數(shù)組只能存放 OC 對象评甜,不能存放 非OC對象類型,如,int、struct捕犬、enum等跷坝,不能存放 nil 值
// 創(chuàng)建不可變數(shù)組
// nil 是數(shù)組元素結(jié)束的標(biāo)記
NSArray *array = [NSArray arrayWithObjects:@"Vampire",@"June",nil];
// 編譯器特性,快速創(chuàng)建OC數(shù)組
NSArray *array1 = @[@"Vampire",@"June"];
// 獲取數(shù)組的個(gè)數(shù)
[array count]; == array.count
// 拿取位置 1 的元素
[array objectAtIndex:1]; == array[1];(編譯器特性碉碉,轉(zhuǎn)成前面代碼)
遍歷 1
Person *p = [[Person alloc] init];
NSArray *array = @[p,@"June"];
for (int i = 0; i < array.count; i++)
{
NSLog(@"%@", array[i]);
}
遍歷 2 快速遍歷
for (id obj in array)
{
// 找出 obj 元素在數(shù)組中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%@ -- %ld", obj, i);
if(i == 1)
{
// 停止遍歷柴钻,退出循環(huán)
break;
///** 注 break 只用在 switch語句 和 for循環(huán)
}
}
遍歷 3 block遍歷
[array enumerateObjectsUsingBlock:
// 每遍歷到一個(gè)元素,就會調(diào)用一次 block
// 并且把當(dāng)前元素和索引位置當(dāng)做參數(shù)傳給 block
^(id obj, NSUInteger idx, BOOL *stop)
{
if(idx == 1)
{
// 停止遍歷
*stop = YES;
}
}];
遍歷 3 block遍歷 的本質(zhì) 解釋
void ^(myBlock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
{
}
for (int i = 0; i < array.count; i++)
{
// 用來標(biāo)記是否需要停止遍歷
BOOL isStop = NO;
// 取出元素
id obj = array[i];
myBlock(obj, i, &isStop);
if(isStop)
{
break;
}
}
-
NSMutableArray
可變
數(shù)組 繼承自NSArray
NSMutableArray *array = [NSMutableArray array];
[array addObject:]; // 添加元素
// 錯(cuò)誤 [array addObject:nil];
[array removeObject:]; // 刪除元素
- 集合的內(nèi)存管理 (MRC里)
NSMutableArray *array = [NSMutableArray array];
Person *p = [[Person alloc] init];
// 當(dāng)把一個(gè)對象添加到集合中時(shí)垢粮,這個(gè)對象會做一次 retain 操作贴届,計(jì)數(shù)器會 +1
// 當(dāng)把一個(gè)對象從集合中移除時(shí),這個(gè)對象會做一次 release 操作足丢,計(jì)數(shù)器會 -1
[array addObject:p];
[p release];
// 當(dāng)一個(gè)集合被銷毀時(shí)粱腻,會對集合里面的所有對象做一次 release,里面的所有對象的計(jì)數(shù)器會 -1
[array release];
// 泛型 指定數(shù)組類型
@property (nonatomic, strong) NSMutableArray <NSString *> *names;
-
NSSet
NSMutableSet
無順序的集合
NSSet *s = [NSSet setWithObjects:@"Vampire",@"June",nil];
[s anyObject]; // 隨機(jī)取出一個(gè)元素
NSMutableSet *s2 = [NSMutableSet set];
-
NSSet
和NSArray
的對比- 共同點(diǎn)
- 都是集合斩跌,都能存放多個(gè)
OC對象
-
只能
存放OC對象
绍些,不能
存放非OC對象
類型(基本數(shù)據(jù)類型:int
、char
耀鸦、float
等柬批,結(jié)構(gòu)體
,枚舉
)
- 都是集合斩跌,都能存放多個(gè)
-不同點(diǎn)
-
NSArray
有順序 -
NSSet
無順序
- 共同點(diǎn)
-
NSDictionary
NSMutableDictionary
字典key
--->value
索引 ---> 文字內(nèi)容
-
里面存儲的東西都是
鍵值對
-
不允許
有相同
的key
,但允許有相同的value
- 無順序
-
NSDictionary *dic = [NSDictionary dictionaryWithObject:@"June" forKey:@"name"];
id obj = [dic objectForKey:@"name"];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"June", @"name", @"地址", @"address",nil ];
NSDictionary *dic = @{@"June": @"name", @"地址": @"address"};
id obj = dic[@"name"];
dic.count // 返回的是 鍵值對 的個(gè)數(shù)
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"jack" forKey:@"name"]; // 添加鍵值對
// 字典中只允許有一個(gè) key,設(shè)置已經(jīng)有的key,value袖订,原來的會被覆蓋
[dic setObject:@"Vampire" forKey:@"name"];
[dic removeObjectForKey"@"name"]; // 移除鍵值對
// 遍歷字典 1
NSArray *keys = [dic allKeys];
for (int i = 0; i < dic.count; i++)
{
NSString *key = keys[i];
id obj *value = dic[key];
NSLog(@"%@ -- %@",key ,value);
}
// 遍歷字典 2
[dic enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop)
{
// 停止遍歷
*stop = YES;
}];
- 集合對比
OC | JAVA |
---|---|
NSArray | List |
NSSet | Set |
NSDictionary | Map |
1. NSArray\ NSMutableArray
* 有序
* 快速創(chuàng)建(不可變):@[obj, obj1, obj2];
* 快速訪問元素:數(shù)組名[i]
2. NSSet\ NSMutableSet
* 無序
3. NSDictionary\ NSMutableDictionary
* 無序
* 快速創(chuàng)建(不可變):@{key1 : value1, key2 : value2};
* 快速訪問元素:字典名[key]
4. 泛型 指定 key value 類型
@property (nonatomic, strong) NSMutableDictionary <NSString *, NSNumber *> *names;
NSNumber
// @10 是將 10 包裝成一個(gè) NSNumber 對象
NSNumber *num = [NSNumber numberWithInt:10]; == @10
int a = [num intValue];
// 將 age 包裝成一個(gè) NSNumber 對象
int age = 100;
[NSNumber numberWithInt:age] == @(age)
// NSNumber 之所以能包裝基本數(shù)據(jù)類型為對象氮帐,是因?yàn)槔^承了 NSValue
NSValue 可以包裝任意值
// 結(jié)構(gòu)體 ---> OC對象
CGPoint p = CGPointMake(10, 10);
// 將結(jié)構(gòu)體轉(zhuǎn)為 Value 對象
NSValue *vv = [NSValue valueWithPoint:p];
// 將 value 轉(zhuǎn)為對應(yīng)的結(jié)構(gòu)體
[vv pointValue];
NSDate
// 創(chuàng)建一個(gè)時(shí)間對象 當(dāng)前時(shí)間 0時(shí)區(qū)時(shí)間(北京-東8區(qū))
NSDate *date = [NSDate date];
// 比 date 時(shí)間 晚 5 秒
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
// 從 1970 開始到 date2 走過多少秒
NSTimeInterval seconds = [date2 timeIntervalSince1970];
[date2 timeIntervalSinceNow];
// 日期格式化類 NSDateFormatter
NSDateFormatter *f = [[NSDateFormatter alloc] init];
// 設(shè)置格式
// y年 M月 d日 Z時(shí)區(qū)
// m分 s秒 H(24)時(shí) h(12)時(shí)
f.dateFormat = @"yyyy-MM-dd HH:mm:ss"
[f stringFormDate:date];
// 創(chuàng)建一個(gè)日歷對象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 利用日歷對象 或者 時(shí)間對象 對應(yīng)的 年、月洛姑、日上沐、時(shí)分秒
int unit = NSCalendarUnitYear | NSCalendarUnitMonth;
NSDateComponents *c = [calendar components:unit formDate:now];
// 打印時(shí)間的要素
NSLog(@"%ld", c.year);
// 利用日歷,比較 時(shí)間 差距
NSString *time1 = @"2014-04-08 20:50:40";
NSString *time2 = @"2014-04-04 18:45:30";
NSDateFormatter *f = [[NSDateFormatter alloc] init];
f.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [f dateFormString楞艾;time1];
NSDate *date2 = [f dateFormString参咙;time2];
// 創(chuàng)建一個(gè)日歷對象
NSCalendar *calendar = [NSCalendar currentCalendar];
int unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *c = [calendar components:unit formDate:date1 toDate:date2 options0];
NSLog(@"相差%ld年%ld月%ld日%ld時(shí)%ld分%ld秒",c.year, c.month, c.day, c.hour, c.minute, c.second);
5. NSFileManager
用來進(jìn)行常見的文件\文件夾操作
-
NSFileManager
使用了單例
模式 - 使用
defaultManager
方法可以獲得單例對象
NSFileManager *mgr = [NSFileManager defaultManager];
// 默認(rèn)不是文件夾,即默認(rèn)是文件
BOOL dir = NO;
// isDirectory 判斷是否是個(gè)文件夾 需要傳 dir 的地址硫眯,可以改變 dir 的值蕴侧,返回值代表 是文件還是文件夾
// 返回值 exist 代表這個(gè)路徑的文件\文件夾是否存在
BOOL exist = [mgr fileExistsAtPath:@"路徑" isDirectory:&dir];
// 獲得文件、文件夾的屬性
NSDictionary *attr = [mgr attributesOfItemAtPath:@"路徑" error:nil];
// 獲得當(dāng)前文件夾下面有哪些內(nèi)容
NSArray *contents = [mgr contentsOfDirectoryAtPath:@"路徑" error:nil];
// 獲得當(dāng)前文件夾下面 所有子路徑
NSArray *contents = [mgr subpathsOfDirectoryAtPath:@"路徑" error:nil];
6. Copy
MutableCopy
- 作用:利用一個(gè)源對象產(chǎn)生一個(gè)副本對象
- 特點(diǎn):修改源對象的屬性和行為两入,不會影響副本對象
- 使用:一個(gè)對象可用調(diào)用 copy\mutableCopy 方法類創(chuàng)建一個(gè)副本對象
copy:創(chuàng)建的是不可變副本(如NSString净宵、NSArray、NSDictionary)
> copy : 需要遵守 NSCopying 協(xié)議,實(shí)現(xiàn) copyWithZone: 方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
mutableCopy:創(chuàng)建的是可變副本(如可變字符串择葡、可變數(shù)組紧武、可變字典)
> mutableCopy : 需要遵守 NSMutableCopying 協(xié)議
實(shí)現(xiàn) mutableCopyWithZone: 方法
@protocol NSCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
-
淺復(fù)制
(淺拷貝,指針拷貝刁岸,shallow copy)-
本質(zhì)
是:沒有
產(chǎn)生新
的對象
- 源對象和副本對象是同一個(gè)對象
- 源對象(副本對象)引用計(jì)數(shù)器 +1脏里,相當(dāng)于做一次 retain 操作
-
-
深復(fù)制
(深拷貝,內(nèi)容拷貝虹曙,deep copy)-
本質(zhì)
是:產(chǎn)生
了新
的對象
- 源對象和副本對象是不同的兩個(gè)對象
- 源對象引用計(jì)數(shù)器不變迫横,副本對象計(jì)數(shù)器為1(因?yàn)槭切庐a(chǎn)生的)
-
只有
源對象
和副本對象
都不可變
時(shí),才是淺復(fù)制
其他都是
深復(fù)制
7. @property
內(nèi)存管理策略的選擇
-
1.非ARC
-
copy
:只
用于NSString\block
(堅(jiān)決不能用可變字符串) -
retain
: 除NSString\block
以外的OC對象 -
assign
: 基本數(shù)據(jù)類型酝碳、枚舉矾踱、結(jié)構(gòu)體(非OC對象),當(dāng)2個(gè)對象相互引用疏哗,一端用retain
呛讲,一端用assign
-
-
2.ARC
-
copy
:只
用于NSString\block
(堅(jiān)決不能用可變字符串) -
strong
: 除NSString\block
以外的OC對象 -
weak
: 當(dāng)2個(gè)對象相互引用,一端用strong
返奉,一端用weak
-
assgin
: 基本數(shù)據(jù)類型贝搁、枚舉、結(jié)構(gòu)體(非OC對象)
-
8. 遞歸
- 1.函數(shù)自己調(diào)自己
- 2.必須有個(gè)明確的返回值
9. static
在 OC 中的使用
static
-
1.修飾局部變量
- 讓局部變量只初始化一次
- 局部變量在程序中只有一份內(nèi)存
- 并不會改變局部變量的作用域芽偏,僅僅是改變了局部變量的生命周期(只到程序結(jié)束雷逆,才會銷毀)
-
2.修飾全部變量
- 全部變量的作用域僅限于當(dāng)前文件
例:#define a 0.5 VS const CGFloat a = 0.5;
像宏一樣,不能改值
有多少使用宏的地方污尉,就會開辟多少臨時(shí)存儲空間
使用
const
膀哲,就只會開辟一個(gè)存儲空間還可以使用 extern 全局引用
如果引用的是個(gè)常量,最好加一個(gè)被碗,
const
例:
extern const CGFloat a
(編譯階段就能很快發(fā)現(xiàn)某宪,避免修改被const
修飾的常量,運(yùn)行是崩潰)