1.OC數組不可以存儲基本數據類型 NSArray: 有序、可以重複、靜態數組
// 1. 數組創建
NSArray* array= [NSArray arrayWithObjects:@"110",@"120", nil];
NSLog(@"--%@",array);
NSLog(@"count==%lu",[array count]);
//2.數組遍歷
for(int i=0;i<[array count];i++){
NSLog(@"count==%@", [array objectAtIndex:i]);
}
//3. 是否包含某一個元素
BOOL bool1= [array containsObject:@"110"];
NSLog(@"bool--%i",bool1);
//4. 快速創建數組
NSArray *arr= @[@155,@100,@30];
NSArray* newArr= [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"newArr--%@",newArr);
Person* p1=[Person new];
p1.age=100;
Person* p2=[Person new];
p2.age=400;
Person* p3 =[Person new];
p2.age=200;
NSArray* pArr=@[p1,p2,p3];
//5. 自定義排序
NSArray* pArrNew= [pArr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person* _Nonnull obj1, Person* _Nonnull obj2) {
return obj1.age - obj2.age;
}];
//6. 字符串切割
NSString* str=@"xiao_ze_ming";
NSArray* strArr= [str componentsSeparatedByString:@"_"];
NSLog(@"strArr=%@",strArr);
// 7. 把數組寫入文件中
// 如果把一個數組寫入文件中,本質寫入一個XML文件
// IOS開發中一般情況下我們會將xml 擴展名保存到plist
// BOOL flag1= [arr writeToFile:@"/Users/denganzhi/abc.plist" atomically:true];
// NSLog(@"flag1=%i",flag1);
// 從文件讀取數據
NSArray* newArray1=[NSArray arrayWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
NSLog(@"newArray1=%@",newArray1);
2. 動態數組 NSMutableArray:
// 1. 創建動態數組
NSMutableArray* arrM=[NSMutableArray arrayWithObject:@"xiaoming1"];
// 2. 添加
[arrM addObject:@"xiaohei2"];
//3. 把指定靜態數組的元素去取出來放入 NSMutableArray 中
[arrM addObjectsFromArray:@[@"lj1",@"xiaozhi"]];
// 4. 插入
[arrM insertObject:@"xcp" atIndex:1];
// 5. 刪除
[arrM removeObject:@"xiaoming1"]; //刪除指定元素
[arrM removeObjectAtIndex:0]; // 刪除指定角標準
[arrM removeLastObject]; // 刪除最後一個元素
//6. 替換
[arrM replaceObjectAtIndex:1 withObject:@"M"];
// 7. 獲取
for(int i=0;i< arrM.count;i++){
NSLog(@"-%d--%@",i,[arrM objectAtIndex:i]);
}
NSLog(@"---%@",arrM);
3. NSDictionary 字典使用:
// 字典創建方式1:
NSDictionary* dict1= [NSDictionary dictionaryWithObject:@"xiaoming" forKey:@"username" ];
NSLog(@"username=%@",[dict1 objectForKey:@"username"]);
// 字典創建方式2:
NSDictionary* dict2= [NSDictionary dictionaryWithObjects:@[@"xiaoming",@"50"] forKeys:@[@"username",@"age"]];
// 字典的簡單創建:
NSDictionary *dict3 = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
NSLog(@"%@ %@ %@", dict3[@"name"], dict3[@"age"], dict3[@"height"]);
// 字典變量
NSArray* keys= [dict3 allKeys];
for(int i=0;i<dict3.count;i++){
NSString* key= keys[i];
NSString* value= dict3[key];
NSLog(@"key=%@,value=%@",key,value);
}
// 迭代器
[dict3 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"key=%@--value:%@",key,obj);
}];
// xml 擴展 plist, NSDictroty 字典和 文件對應
[dict3 writeToFile:@"/Users/denganzhi/abc.plist" atomically:YES];
NSDictionary* newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
NSLog(@"newDict=%@",newDict);
4. NSMutableDictionary 字典使用:
// 1.可變字典
// 字典創建
NSMutableDictionary* dictM=[NSMutableDictionary dictionary];
// 2.添加
[dictM setObject:@"lnj" forKey: @"username"];
// 添加傳入參數是字典
[dictM setValuesForKeysWithDictionary: @{@"age":@"30",@"name":@"xiaoming"}];
// 3. 刪除
[dictM removeObjectForKey:@"age"];
// 4. 獲取
NSLog(@"username=%@",dictM[@"username"]);
// 5. 修改
// setObject 存在那麼添加
// setObject 不存在那麼修改
[dictM setObject:@"ddahei" forKeyedSubscript:@"name"];
NSLog(@"---%@",dictM);
// 可變字典和不可變字典對比
// 如果是不可變字典出現同名key, 那麼後面的key對一個的值不會被保存
//如果是可變字典出現同名key, 後面的會覆蓋前面的
5. 常用結構體
// 常用結構體,保存座標、尺寸、座標和尺寸
// CGPoint 和 NSPoint 一樣的 取了一個別名
NSPoint point= NSMakePoint(100, 200);
NSSize size= NSMakeSize(200, 200);
NSRect rect= NSMakeRect(0, 0, 100, 100);
6. NSNumber NSValue 包裝類
//NSNumber 包裝基本數據類型
int age=100;
// 1. 將基本數據類型 轉化爲對象類型,對象類型纔可以存儲NSArray
NSNumber* ageNumber= [NSNumber numberWithInt:age];
int age1= [ageNumber intValue];
NSLog(@"age1=%d",age1);
//2. 簡寫,如果是變量必須,@()
NSNumber* temp=@(age);
// 基本數據類型寫法
NSNumber* temp1= @40;
// NSValue 包裝結構體
// 1. 如果是OC結構體: 使用系統提供的 valueWithxxx
CGPoint point = NSMakePoint(10, 20);
NSValue *value = [NSValue valueWithPoint:point];
NSLog(@"value=%@",value);
// 2. NSValue 包裝自定義結構體
struct Person{
int age;
char* name;
};
struct Person p={100,"小明"};
// 第一個是指針,第二個是結構體類型
// 把結構體 放入 NSValue中包裝
NSValue *pValue = [NSValue valueWithBytes:&p objCType: @encode(struct Person)];
// 保存成 NSValue 纔可以存入 NSArray中
NSArray* arr= @[pValue];
struct Person res;
// 從pvalue 中 取出自定義 結構體
[pValue getValue:&res];
NSLog(@"%s", res.name);
7. NSDate 、 NSCalendar
//NSDate: 時間
//NSDate ---> NString, 輸出當前時間
NSDate* now=[NSDate new];
// 在now基礎上 增加一個天 86400
NSDate* mingtiang= [now dateByAddingTimeInterval:86400]; // 在now
NSDateFormatter* nsformater= [NSDateFormatter new];
nsformater.dateFormat=@"yyyy-MM-dd HH:mm:ss";
NSString* str= [nsformater stringFromDate:now];
NSString* str1= [nsformater stringFromDate:mingtiang];
NSLog(@"now時間是:%@",str);
NSLog(@"mingting時間是:%@",str1);
// NString —> NSDate
NSDate* date1= [nsformater dateFromString:str];
// NSCalendar 日曆類
NSCalendar* calender1= [NSCalendar currentCalendar];
// 使用l日曆類 從 NSDate中獲取時間
NSCalendarUnit type =NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay |
NSCalendarUnitHour |
NSCalendarUnitMinute |
NSCalendarUnitSecond;
NSDateComponents * cmps= [calender1 components:type
fromDate:now];
NSLog(@"year==%ld,month=%ld,day=%ld", cmps.year,cmps.month,
cmps.day);
// 比較2個時間的差值
NSDate* now2= [NSDate new];
NSDate* mingtiang2= [now dateByAddingTimeInterval:86400]; // 在now
NSDateComponents* cmps23 = [calender1 components:type fromDate:now2 toDate:mingtiang2 options:0];
NSLog(@"差距是,year==%ld,month=%ld,day=%ld,h=%ld,min=%ld,ss=%ld", cmps23.year,cmps23.month,cmps23.day,cmps23.hour,cmps23.minute,cmps23.second);
8. NSFileManager 文件夾api 使用
NSFileManager* manager= [NSFileManager defaultManager];
// 1. 判斷文件是否存在
BOOL flag= [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist"];
NSLog(@"flag=%i",flag);
// 2. 判斷一個文件是否存在並且是否是一個文件夾
// 如果存在flag2=1 如果是目錄dir=1
BOOL dir=NO;
BOOL flag2= [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist" isDirectory:dir];
NSLog(@"flag2=%i,dir=%i",flag2,dir);
//3. 獲取文件或者文件夾屬性
NSDictionary* info= [manager attributesOfItemAtPath:@"/Users/denganzhi/abc.plist" error:nil];
// 文件屬性放回在字典中
// NSLog(@"info=%@",info);
// 4. 獲取文件夾下所有文件
// 只能獲取當前文件夾下所有文件名稱
//不能 獲取子孫文件
NSArray* res = [manager contentsOfDirectoryAtPath:@"/Users/denganzhi/" error:nil];
// NSLog(@"res=%@",res);
// 5. 可以獲取 子孫文件
// NSArray *res1= [manager subpathsAtPath:@"/Users/denganzhi/githubinfo/"];
NSArray* res1= [manager subpathsOfDirectoryAtPath:@"/Users/denganzhi/githubinfo/" error:nil];
NSLog(@"res=%@",res1);
// 6. 創建文件夾,只能創建 文件夾
// 路徑, 上傳文件不存在,是否自動創建
// 屬性
// 錯誤類型
[manager createDirectoryAtPath:@"/Users/denganzhi/create" withIntermediateDirectories:YES attributes:nil error:nil];
// 7. 文件創建 ,寫入 str7
NSString* str7=@"小置同學";
NSData* data7= [str7 dataUsingEncoding:NSUTF8StringEncoding];
[manager createFileAtPath:@"/Users/denganzhi/create.txt" contents:data7 attributes:nil];
9. 淺拷貝 和深拷貝 oc中
深拷貝: 內存拷貝
NSMutableString* mstr=[NSMutableString stringWithFormat:@"身拷貝"];
NSString* mstrcopy= [mstr copy];
深拷貝產生了新的對象,mstr 和 mstrcopy 指針不同
A淺拷貝: 拷貝出來的和原來的都指向同一塊內存
NSString* str=@"淺拷貝";
NSString* copystr =[str copy];
NSLog(@"str=%p,copystr=%p",str,copystr);
str 和 copystr 都是 指向 同一個字符串,指針相同,除了這種類型,其他的都是深複製
10. 單例設置模式:
Tools.h:
//
// Tools.h
// 其他api
//
// Created by 鄧安置 on 2020/5/10.
// Copyright © 2020 鄧安置. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Tools : NSObject<NSCopying,NSMutableCopying>
// 一般情況下創建一個 單例對象都有一個與之對應的類方法
// 一般情況下用於創建單例對象的方法名都以 share或者 default開發
+(instancetype)shareInstance;
@end
NS_ASSUME_NONNULL_END
Tools.m:
//
// Tools.m
// 其他api
//
// Created by 鄧安置 on 2020/5/10.
// Copyright © 2020 鄧安置. All rights reserved.
//
#import "Tools.h"
@implementation Tools
+(instancetype)shareInstance{
Tools* instance=[[self alloc] init];
return instance;
}
static Tools* _instance = nil ;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
// 單線程版本
// 調用alloc的時候回調用 該方法
// 在該方法中控制當前對象只創建一次即可
// if(_instance == nil){
// // 申請內存
// _instance= [[super allocWithZone:zone] init];
// }
// 多線程版本
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance= [[ super allocWithZone:zone] init];
});
return _instance;
}
/**
所有的oc 對象 都實現 NSCopying,NSMutableCopying 協議,保證可以進行深拷貝
重新分配內存
*/
- (id)copyWithZone:(NSZone *)zone{
// Tools* t = [[[self class] allocWithZone:zone] init];
// return t;
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end
main中 使用:
// 單例設計模式
Tools* t1=[Tools shareInstance];
Tools* t2=[Tools shareInstance];
// t1 和 t2 地址 相同
NSLog(@"單例:%p,%p",t1,t2);
11. IOS kvc 使用
valueForKey
forKeyPath
setValuesForKeysWithDictionary
valueForKey
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1. kvc 和 對象
Person* person=[Person new];
// 可以kvc 給對象賦值
[person setValue:@"xiaoming" forKey:@"name"];
// age 是 int 類 , kvc可以指定類型 轉化
[person setValue:@"20" forKey:@"age"];
// 取出p1對象中 age name 屬性的值
NSLog(@"name=%@,age=%@",[person valueForKey:@"name"],
[person valueForKey:@"age"]);
// 2. 對象中還有對象
Book* book= [Book new ];
book.bookName=@"飄";
person.book =book ;
[person setValue:@"挪威的森林" forKeyPath:@"book.bookName"];
NSLog(@"bookName=%@",book.bookName);
// 3. kvc與 字典
// 字典的key值 -> 一定要和對象中的屬性名對應,保存一致
NSDictionary* dict=@{@"name":@"xiaoze",@"age":@"30"};
[person setValuesForKeysWithDictionary:dict];
NSLog(@"name=%@,age=%ld", person.name,
person.age
);
// 4.kvc 和 數組
Person* p1=[Person new];
p1.age=22;
Person* p2=[Person new];
p2.age=400;
NSArray* array=@[p1,p2];
NSArray* nameArray= [array valueForKey:@"age"];
NSLog(@"nameArray=%@",nameArray);
}
return 0;
}
Person.h
#import <Foundation/Foundation.h>
@class Book;
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
@property(nonatomic,copy) NSString* name;
@property(nonatomic,assign) NSInteger age;
@property(nonatomic,strong) Book* book;
@end
NS_ASSUME_NONNULL_END
book.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Book : NSObject
@property(nonatomic,copy) NSString* bookName;
@end
NS_ASSUME_NONNULL_END