这是我参与「第四届青训营 -iOS场」笔记创作活动的的第1篇笔记
现状
生态
- 依托iOS全家桶设备,平均每人安装66个APP
- 生态网络,注重设备联动
- 关注WWDC
现状
- 客三消,客户端开发在三年内消失
- 早期存在红利,门槛低,需求量大,但是互联网整体趋于成熟,需求量减小,且大前端趋势,小程序替代了原生开发
开发
开发语言
- 原生oc/swift/c/c++
- 跨端reactNative/flutter
基本语法-以解析器为例
MyJsonParser类
MyJsonParser.h
#import <Foundation/Foundation.h>
// class修饰,避免循环依赖,只是告诉xcode ByteDancer是一个类,并不进行实际引用
@class ByteDancer;
// 声明类,继承了 NSObject,在.h文件中声明的才能被外访问
@interface MyJsonParser : NSObject
// 声明自定义的构造函数
- (instancetype)initWithFile:(NSString *)filePath;
// 声明对象方法
- (ByteDancer *)parse;
@end
MyJsonParser.m
#import "MyJsonParser.h"
#import "ByteDancer.h"
#import <Foundation/Foundation.h>
// 扩展写法,声明的filePath是私有的,用@property 可以自动填充setter/getter
@interface MyJsonParser ()
@property (nonatomic, assign) NSString *filePath;
@end
// 实现
@implementation MyJsonParser
// 自定义构造函数的写法,需要调用[super init]
- (instancetype)initWithFile:(NSString *)filePath {
if (self = [super init]) {
_filePath = filePath;
}
return self;
}
- (ByteDancer *)parse {
// 读取文件
NSData *fileContent = [self readFile];
// 用序列化解析成字典
NSDictionary *dictionary = [MyJsonParser parseJsonStr:fileContent];
ByteDancer *byteDancer = [[ByteDancer alloc] init];
if ([dictionary objectForKey:@"name"]) {
byteDancer.name = (NSString *)[dictionary objectForKey:@"name"];
}
return byteDancer;
}
- (NSData *)readFile {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSData *content = [fileManager contentsAtPath:self.filePath];
if (!content) {
exit(1);
}
return content;
}
// 类方法用+号,方法参数格式为 :(type1)name1 (and):(type2)name2 ...
+ (NSDictionary *)parseJsonStr:(NSData *)jsonData {
return [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
}
@end
ByteDancer类
ByteDancer.h
@interface ByteDancer : NSObject
// name可以被外界访问
@property (nonatomic, copy) NSString *name;
- (instancetype)initWithAge: (int)age;
+ (void)sayHello;
- (int)add: (int)num;
@end
ByteDancer.m
#import "ByteDancer.h"
@interface ByteDancer ()
@property (nonatomic, assign) int age;
@end
@implementation ByteDancer
+ (void)sayHello {
NSLog(@"hello");
}
- (instancetype)initWithAge:(int)age {
if (self = [super init]) {
_age = age;
}
return self;
}
- (int)add:(int)num {
return self.age + num;
}
@end
main
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// 调用类方法
[ByteDancer sayHello];
// 创建对象
ByteDancer *bytedancer = [[ByteDancer alloc] initWithAge:10];
// 调用对象方法
int ret = [bytedancer add:1];
NSLog(@"%d", ret);
NSLog(@"Hello, World!");
}
return 0;
}
property参数
- 自定义getter/setter名,
setter = setMyName,gtter =myName
,可以指定方法名 - 生命周期相关
assign/retain
,对非OC对象,用assign
即可;OC对象用retain
,会在setter中处理内存计数器,但是对于ARC模式下,就不用了,自动管理内存;避免虚幻依赖时,可以对其中一个用assign
- 可读可写
readwrite
,默认的,生成setter/getter;可读readonly
,只生成getter - ARC下
weak/strong
,都是针对OC对象,默认是strong
强引用,计数+1;发生循环依赖时,一个使用weak
- 多线程
nonatmoic/atmoic
,atmoic
保证变量线程安全,类似volatile
的定位,从内存中读取;默认都是nonatmoic
,性能高 - 深浅拷贝
copy
,默认是浅拷贝,用copy
使用深拷贝,用于NSString
框架
- frameworks,具备特点环境,通用的代码库
- iOS的Frameworks,是一个有层级的目录,将动态代码库,nib files,图片文件,头文件和参考文件,全部封装成一个单一的资源包,多个程序之间可以同时共用它,并被程序调用去执行某个任务。
- 框架分层,上层依赖底层,底层不会依赖上层
- Coca Touch 触摸层,UI界面,UIKit
- Media 媒体层,图形、音视频的支持
- Core Services 服务层,基础服务
- Core OS 操作系统层,苹果接近硬件的框架,应用于其他框架
- Foundation框架,为其他框架,提供基础能力,数据持久化、网络、文件处理等
- NSObject,顶级父类,遵守了NSObject的协议
- alloc 分配内存空间
- init 为alloc分配后的空间,进行初始化对象
- new 相当于 alloc后init
- preformSelector 通过方法选择器进行方法调用,不会进行编译器校验
为什么要有NSArray和NSMutableArray
- NSArray,确保线程安全,查找性能好,数据不会被修改,用于属性声明或者是方法参数
- NSMutableArray,对象数据可能被修改,线程不安全,查找性能较差,一般用于方法内的临时变量,做增删
调试
- LLDB调试组件是LLVM编译器的一个debug组件
- p/po 打印对象或者对象信息;po调用
debugDescription
;p会保存在临时变量中 - expression,直接执行表达式
expression [label setText:@"nihao"];