不要急,不要怕

oc基础函数

A 65 a 97 0 48
//ARC 自动应用计数 自动内存管理
//MRC 手动内存管理
Student *s =[[[Student alloc]init]autorelease];//用完之后自动释放
[s release];//手动释放;
给对象发送retain或release消息,可以让计数器+1或-1.当一个对象计数器为0时,
// init实例化 就是 初始化 ;
//减方法(对象方法,动态方法)开辟内存
//只能是对象去调用

  • (int)addC:(int)a andD: (int)b;
    //+方法(类方法)是用类名去调用(student)
    //[Student addA:11 andB:12]调用(是用函数);
  • (int) addA:(int)a andB:(int)b;
    //instancetype和 id 差不多,都代表类似任意对象(可以代表任意数据类型)
    //id 可以代表int float (指针类型);
    // id = Student
    =instancetype

//super 代表他的上一层 是NSObject
self = [super init];

字符串:

//格式化创建;
NSString str1 = [[NSString alloc]initWithFormat:@”gezhihua1chuangjoain1”];
//我在创建字符串的时候 给他设定 一定的空间,开始定义大小为0,
//➕方法;
NSMutableString
mstr2 = [NSMutableString stringWithCapacity:0];
//➖方法;
NSMutableString kong = [[NSMutableString alloc]initWithCapacity:0];
字符串的添加
[arr addObject:dic[key]];
/拼接;stringByAppendingString:得到一个新的数组;
NSString
str2 =[str1 stringByAppendingString:str];
//追加 appendString追加必须是可变字符串
[mstr1 appendString: @”小明他朋友”];
//判断一个字符串前缀是否包含@“”hasPrefix:
//判断一个字符后缀是否包含某一字符串hasSuffix:
BOOL prefix =[str2 hasPrefix:@”geshi”];
//比较字符串是否相同 isEqualToString:
NSString same1 = @”小花”;
NSString
same2 = @”大花”;
BOOL isEqual = [same1 isEqualToString: same2];
//rangeOfstring : 查找
NSRange range = [we rangeOfString:@”Beijing”];
//字符串的比较大小
//{NSOrderedAscending升序 , NSOrderedSame, NSOrderedDescending降序};
NSComparisonResult result =[st1 compare:st2];
//从索引开始截取索引取到最后substringFromIndex:2
//截取从开始到索引substringToIndex:2
//根据范围截取substringWithRange:
NSString s = [d substringWithRange:NSMakeRange(i, 1)];
NSString
Ne = [hei substringFromIndex:2];
NSString Ke = [hei substringToIndex:2];
//可变字符串根据范围的修改;replaceCharactersInRange:NSMakeRange(0, 2) withString:
[mA replaceCharactersInRange:NSMakeRange(0, 2) withString:@”大白”];
NSString
str = @”become so numb”;

NSLog(@”%@”,[str uppercaseString]);//全部变为大写的
NSLog(@”%@”,[str lowercaseString]);//字符串里的字符全部变为小写;
NSLog(@”%@”,[str capitalizedString]);//首字母变大写,其他字母别小写
NSComparisonResult result2 = [@”abc” caseInsensitiveCompare:@”ABC”];//忽略大小写比较
//将字符串中的元素用@“ ”切割成字符串;
NSArray b =[a componentsSeparatedByString:@” “];
//将网址转换成字符串;对象方法;
NSURL
url = [NSURL URLWithString:@”https://www.baidu.com“];
NSString str5 =[[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
//读取桌面上的文件city.xml
//NSArray arrayWithContentsOfFile
NSString
path2 = @”/Users/feique/Desktop/city.xml”;
NSArray *arr2 = [NSArray arrayWithContentsOfFile:path2];

NSString str2 = [[NSString alloc]initWithContentsOfFile: path2 encoding:NSUTF8StringEncoding error:&error];
用来将H5的换行等直接读取出来
NSString
newStr1=[[[str1 stringByReplacingOccurrencesOfString:@”
“ withString:@”\n”]stringByReplacingOccurrencesOfString:@”“ withString:@””]stringByReplacingOccurrencesOfString:@”“ withString:@””];
//读取网络上的数据,这个用户体验不太好,markmark
// UIWebView *answerView=[[UIWebView alloc]initWithFrame:CGRectMake(10, CGRectGetMaxY(autherLabel.frame)+20, screen_width-20, answersize.height)];
// answerView. allowsInlineMediaPlayback = NO;
// [answerView loadHTMLString:self.dTModel.answer_content baseURL:nil];

数组:

//1.基本的创建数组的方式
NSArray arr = @[@”小米”,@[@”xiaomi”,@”华为”],@”苹果”];
//通过数组得到一个新的数组;动态方法;
NSArray
arr2 = [[NSArray alloc]initWithArray:arr];

NSArray arr3 = [[NSArray alloc]initWithObjects:@”123”,arr,@”hello”, nil];
// 数组元素的添加;
NSArray
arr4 = [arr arrayByAddingObject:@[“魅族”,@”huawei”];
//arr5.count arr5 里对象的个数
//找对象在数组里边的下标; indexOfObject:
int idx = (int)[arr indexOfObject:@”2”];
//找下标所对应的数组元素;objectAtIndex:
NSString one =[key objectAtIndex:idxV];
/可以判断对象是某种类型 isKindOfClass:
if ([obj isKindOfClass:[NSArray class]]) {
NSLog(@”%@是数组”,obj);
//判断元素存在
if ([array1 containsObject:@”a”]) { }
//获取最后一个元素
NSString
last = [array1 lastObject];
//根据位置获取
NSString *one = [array1 objectAtIndex:1];
//获取元素位置
int index = [array1 indexOfObject:@”b”];

//将字符串中的元素用@“ ”切割成字符串;
NSArray b =[a componentsSeparatedByString:@” “];
//将数组中的元素合成一个字符串;
NSString
str = [arr componentsJoinedByString:@” “];
//将不可变数组变为可变数组;NSMutableArray arrayWithArray
NSMutableArray *mArr2 = [NSMutableArray arrayWithArray:arr];
//添加加一个对象
[mArr2 addObject:@”xiaohei”];
//mArr2 插入 @”123”到 第0 个位置insertObject:
//之后的元素向后移一个下标;
//如果插入对象的位置大于数组个数的话,数组越界;奔溃;
//最多插到mArr2.count
[mArr2 insertObject:@”123” atIndex:mArr2.count];
//替换 第 2 个位置的对象 用 @“666”
[mArr2 replaceObjectAtIndex:2 withObject:@”666”];
NSLog(@”marr2 %@”,mArr2);
//删除第2个个对象
[mArr2 removeObjectAtIndex:2];

数组排序:

//sortedArrayUsingSelector:快速排序;
NSArray arr2 = [arr sortedArrayUsingSelector:@selector(compare:)];
//用block设置比较方件进行排序
NSArray
array3 = [array sortedArrayUsingComparator:^NSComparisonResult(Student obj1, Student obj2) {
//比较算法
}];
//自己定义一种方法;
-(NSComparisonResult)studentCompare:(Student *)stu{

NSComparisonResult result = [self.lastname compare:stu.lastname];

if(result == NSOrderedSame){
result = [self.firstname compare:stu.lastname];
}
return result;
}
利用属性排序;
/NSSortDescriptor利用属性排序
//用phone.name的属性排序;
NSSortDescriptor desc1 = [NSSortDescriptor sortDescriptorWithKey:@”phone.name” ascending:YES];
//strArr2里边存的是student,star 是student 这样对象的数组 sortedArrayUsingDescriptors:
NSArray <Student
> *stuArr2 = [stuArr sortedArrayUsingDescriptors:descArr];

//字符串用copy
@property(nonatomic,copy) NSString firstname;
//int float ->assign
@property(nonatomic,assign) int
age;
// 数组用strong retain
@property (nonatomic,retain)NSArray *books;

数组遍历;
for (int i = 0; i<arr.count; i++)

for (NSString *str in arr)
for ( id obj in arr)

[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL _Nonnull stop) {
//obj 为遍历到的对象 idx 下标 stop 停止参数; Nonnull不能为空;
if (idx==2) {
//stop什么
stop = YES;
}
}];
NSLog(@”%@,->地址%zi”,obj,idx);}
迭代器:
NSLog(@”打印迭代器%@”,[enu allObjects]);
//将迭代器里的元素赋值到可变数组中:
可变数组有一种机制,赋值之后数据就不存在了
obj = [enumerator nextObject]
[mArr1 addObject:obj];
//正序输出;
NSEnumerator enu = [arr objectEnumerator];
[marr ];
//倒叙输出;
NSEnumerator
enu = [arr reverseObjectEnumerator];
//得到一个倒叙的数组;
while (obj = [enu nextObject]) {
//obj = [enu nextObject];
NSLog(@”%@”,obj);
// NSLog(@”打印迭代器%@”,[enu allObjects]);

}

字典:

//字典的实例话方法;
/通过两个数组去创建一个字典,一个数组存的是value ,另一个存的是key;key与value是相互对应的;
NSDictionary dic3 = [[NSDictionary alloc]initWithObjects:@[@”21”,@”12”,@”23”] forKeys:@[@”xiaohua”,@”xiaobai”,@”xiaoming”]];
//获取字典里边所有的key和value 用数组接受
NSArray
a = [dic allKeys];
NSArray *b = [dic allValues];

NSDictionary dic4 =
[[NSDictionary alloc]initWithObjectsAndKeys:@”value”,@”key”,@”12”,@”xiaoming”,@”23”,@”xiaobai”, nil];
//改变字典中的某一ge必须是可变字典;
[dic4 setValue:@”33” forKey:@”xiaoming”];
//创建一个字典dic5并于dic4一样;
NSDictionary
dic5 = [[NSDictionary alloc]initWithDictionary:dic4];
//插入修改方法;
[dic setObject:@”value” forKey:@”key1”];
[dic setValue:@”haha” forKey:@”key2”];
//删除某个元素根据key值;
[dic removeObjectForKey:@”key2”];
//删除所有对像;
//[dic removeAllObjects];
//根据数组的key进行一一对应的删除,删除多个元素,如果没有该key则不处理;
[dic removeObjectsForKeys:@[@”key1”,@”key4”]];
将其他类型转化为对象:

//将int 转换为对象;
int a =1;
NSNumber num =@(a);
NSNumber
nmu = [NSNumber numberWithInt:a];
//将对象转化为int;
int b = [num intValue];
NSLog(@”对象%@ %@ int%i”,num,nmu,b);
//对象与bool YES 1 NO 0
NSNumber num2 = [NSNumber numberWithBool:NO];
BOOL o =[num2 boolValue];
//对象与float型的转化;
NSNumber
num3 = [NSNumber numberWithFloat:3.1415];
int l=[num3 floatValue];
NSLog(@”float%@ %i”,num3,l);

NSRange range = NSMakeRange(2, 5);
//结构题转成对象;
NSValue *v1 = [NSValue valueWithRange:range];
//对象转还为结构体
NSRange range1 = [v1 rangeValue];

集合:

//集合不能重复,且是无序的;
//1.3种创建方法;
NSSet set = [NSSet setWithArray:arr];
NSSet
set1 =[NSSet setWithObjects:@”3”,@”2”,@”1”,nil];
//NSSet *set2 =[NSSet setWithSet:set1];
NSLog(@” %@%@ %@ “,arr,set,set1);

NSEnumerator e =[set1 objectEnumerator];
NSString
s;
while (s=[e nextObject]) {
NSLog(@”%@”,s);

}
//2.判断某个对象是否为集合的成员,如果是这输出这个成员,
//否则为nil
NSString str =[set1 member:@”5”];
//3.判断集合里边是否包含某个成员;
BOOL r =[set containsObject:@”3”];
//
NSLog(@”%@”,r==1?@”YES”:@”NO”);
NSLog(@”%@”,str);
//4.将set转化为数组;
NSArray
arr1 =set1.allObjects;
NSLog(@”%@”,arr1);
//获得集合中的任意一个对象;
NSString *str2 =[set1 anyObject];
NSLog(@”%@”,str2);
//判断两个集合是否相同;
BOOL r1 = [set1 isEqualToSet:set];
NSLog(@”%@”,r1==1?@”YES”:@”NO”);
//7.判断两个集合是否有交集;
BOOL r2 =[set intersectsSet:set];
NSLog(@”%@”,r2==1?@”YES”:@”NO”);
//8.判断一个set是否是另一个的子集;
BOOL r3 =[set1 isSubsetOfSet:set];
NSLog(@”%@”,r3==1?@”YES”:@”NO”);

//可变集合NSMutableSet可以使用NSSet中的所有方法;
//1.如何创建;
NSMutableSet mset =[NSMutableSet setWithCapacity:10];
//2.添加元素;
[mset addObject:@”3”];
[mset addObject:@”2”];
//3.删除;
[mset removeObject:@”3”];
//4.继承方法演示count,5.遍历;
NSUInteger count =set.count;
//为什么是%lu
NSLog(@”%lu”,count);
NSEnumerator
e1 =[mset objectEnumerator];
NSString S;
while (S =[e1 nextObject]) {
NSLog(@”%@”,s);
}
//6.添加一个数组;
NSArray
arr2 =@[@”one”,@”two”,@”three”];
[mset addObjectsFromArray:arr2];
NSLog(@”%@”,mset);
//7.删除所有元素;
//[mset removeAllObjects];
//8.求两个集合的并集;注意必须是可变集合;
NSMutableSet *mset2 =[NSMutableSet setWithSet:mset];
[mset2 addObject:@”ha”];
[mset unionSet:mset2];

NSLog(@”%@”,mset);
//交集;
[mset intersectSet:mset2];
//求两个集合的差集;
[mset2 minusSet:mset];
复制;

复制为不可变; //-(id)copy;
复制为可变; //-(id)mutableCopy;
NSMutableArray marr3 =[marr2 mutableCopy];
//自定义的类要想实现NScopying协议或NSmutableCopying协议;
Person
p3 =[p1 mutableCopy];
@interface Person : NSObject
-(id)mutableCopyWithZone:(NSZone )zone{
NSLog(@”mutablecopywithZone”);
Person
pre =[[Person allocWithZone:zone]init];
return pre;
}
Block排序!!!
NSArray arr =@[@”43”,@”12”,@”31”];
NSArray
arr1 =[arr sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];

}];

协议与Block:

通常建议建立一个OCProtocol单独保存协议,只有.h没有.m,因为它不需要实现类。
如果需要同时实现两个协议,则<协议1,协议2>。
如果需要控制协议里的方法必须要实现,则需要在方法的上面加上@required,这样一来,这个标记下的所有方法都必须实现了,但是即便标记了,也可以不实现,编译器不会报错,因为C语言语法弱。选择性实现的用@optional表示,默认是required(废的)。
判断一个类是否实现了协议,有如下方法:
if ([listener conformsToProtocol:@protocol(ButtonDelegate)])

Block封装了一段代码,可以在任何时候执行,类似于函数指针,也类似C#的Func和Action,它用尖括号定义,可以做参数注入lambda,也可以做回调,比如:
int (^Sum)(int,int) = ^(int a, int b) {
return a + b;
};
int a = Sum(10,11);
在block里是可以使用花括号外的变量的,但是不能修改它,类似java在外部加一个final,除非加一个关键字block就能改变了,比如:
void test() {
block int c = 1;
int (^Sum)(int,int) = ^(int a, int b) {
c = 10;
return a + b + c;
};
NSLog(@”%i”, Sum(1,2));
}
另外可以提前声明block的类型:
typedef int (^MySum) (int,int);
这样就可以用这个类型来定义block了:
MySum sum = ^(int a, int b) {
return a+b;
};
下面是一个block作为监听器属性的例子,可以理解为从调用层set一个lambda表达式进去:
//main.m

#import

#import “Button.h”
int main(int argc, const char argv[])
{
@autoreleasepool {
Button
btn = [[[Button alloc] init] autorelease];
btn.block = ^(Button *btn) {
NSLog(@”按钮-%@被点击了”, btn);
};
[btn click];
}
return 0;
}
//buttom.h

#import
@class Button;
//定义一个block的类型
typedef void (^ButtonBlock) (Button *);
@interface Button : NSObject
//定义一个block的属性
@property (nonatomic, assign) ButtonBlock block;
-(void)click;
@end
//Button.m

#import “Button.h”
@implementation Button
-(void)click{
_block(self);
}
@end
//4.类型定义typedef define
//typedef返回值类型(^BlockName)参数列表
typedef void(^my_blaock)(void);
my_blaock b = ^(void){NSLog(@”hello,world”);};
b();

typedef int (^_SumBlock)(int a,int b);
_SumBlock sumBlock = ^(int a,int b){return a+b;};
int su = sumBlock(1,3);

单例:

static MusicManger manager =nil;
//最普通的写法;
+(MusicManger
)shareMusicManger{

if (manager==nil) {
manager = [[MusicManger alloc] init];
}
return manager;
}
//GCD的写法;
//保证在多线程的时候有且只有一个一次实例化;
+(MusicManger *)shareMusicManger{

static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{

if (manager==nil) {
manager = [[MusicManger alloc] init];
}

});
return manager;
}
//加锁的写法;
+(MusicManger )shareMusicManger{
@synchronized(self) {
if (manager==nil) {
manager = [[MusicManger alloc] init];
}
return manager;
}
系统单例
//NSdefaults 他是以Key -value的方式进行存储数据;
NSUserDefaults
defaults = [NSUserDefaults standardUserDefaults];
-(文件操作单例)
NSFileManager *fileManger = [NSFileManager defaultManager];
//删除一个文件;
BOOL isFinish = [fileManger removeItemAtPath:@”/Users/feique/Desktop/haha.txt” error:nil];
BOOL ha =[fileManger fileExistsAtPath:@”/Users/feique/Desktop/haha.txt” isDirectory:nil];
if (ha) {
if (isFinish) {
NSLog(@”文件删除成功”);
}else{
NSLog(@”文件删除失败”);}
}else{
NSLog(@”路径无效”);
}