iOS现状和基本开发 | 青训营笔记

137

这是我参与「第四届青训营 -iOS场」笔记创作活动的的第1篇笔记

现状

生态

  • 依托iOS全家桶设备,平均每人安装66个APP
  • 生态网络,注重设备联动
  • 关注WWDC

现状

  • 客三消,客户端开发在三年内消失
  • 早期存在红利,门槛低,需求量大,但是互联网整体趋于成熟,需求量减小,且大前端趋势,小程序替代了原生开发

开发

-零基础iOS开发学习日记

开发语言

  • 原生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/atmoicatmoic保证变量线程安全,类似volatile的定位,从内存中读取;默认都是nonatmoic,性能高
  • 深浅拷贝copy,默认是浅拷贝,用copy使用深拷贝,用于NSString

框架

  • frameworks,具备特点环境,通用的代码库
  • iOS的Frameworks,是一个有层级的目录,将动态代码库,nib files,图片文件,头文件和参考文件,全部封装成一个单一的资源包,多个程序之间可以同时共用它,并被程序调用去执行某个任务。
  • 框架分层,上层依赖底层,底层不会依赖上层
  1. Coca Touch 触摸层,UI界面,UIKit
  2. Media 媒体层,图形、音视频的支持
  3. Core Services 服务层,基础服务
  4. Core OS 操作系统层,苹果接近硬件的框架,应用于其他框架
  • Foundation框架,为其他框架,提供基础能力,数据持久化、网络、文件处理等
  • NSObject,顶级父类,遵守了NSObject的协议
  1. alloc 分配内存空间
  2. init 为alloc分配后的空间,进行初始化对象
  3. new 相当于 alloc后init
  4. preformSelector 通过方法选择器进行方法调用,不会进行编译器校验

为什么要有NSArray和NSMutableArray

  • NSArray,确保线程安全,查找性能好,数据不会被修改,用于属性声明或者是方法参数
  • NSMutableArray,对象数据可能被修改,线程不安全,查找性能较差,一般用于方法内的临时变量,做增删

调试

  • LLDB调试组件是LLVM编译器的一个debug组件
  • p/po 打印对象或者对象信息;po调用debugDescription;p会保存在临时变量中 image.png
  • expression,直接执行表达式 expression [label setText:@"nihao"];