zoukankan      html  css  js  c++  java
  • Android开发快速入门iOS开发概览

    注:本文同步发布于微信公众号:stringwu的互联网杂谈 Android开发快速入门iOS开发概览

    1 前言

    笔者总结了自己在拥有Android开发的相关基础后入门iOS开发时遇到的点点滴滴给其他想入门iOS 开发的Android开发的一些参考,少走一些弯路,快速上手iOS开发;
    文章会以iOSAndroid的开发工具,语言,工程文件和启动类的对比为主线,一步步带你了解 iOS版本的 HelloWord是如何编写的;
    两者的主要对比概览

    平台 IDE 语言 依赖管理 UI主界面 应用入口
    Android Android Studio java(kotlin) maven Activity Application
    iOS Xcode object-c(swift) Cocoapods Controller AppDelegate

    2 工具篇

    iOS的开发工具 Xcode可直接在线获取并安装,如果仅是简单的开发一个HelloWorld工程,则可直接新建个工程运行就可。但如果需要使用其他第三方库时,则离不开Cocoapods工具了;

    2.1 Cocoapods

    Cocoapods 就是iOS开发中的maven,主要用于集成管理第三方的依赖库。本文仅简单介绍在Mac下安装 Cocoapods最快捷的安装方式 gem install cocoapods ,详细内容可参考文档cocoapods安装文档 ;
    安装完成后在命令行运行:pod --version 查看本地安装的版本就可以,几个常用的pods命令,这几个命令在开发中的使用概率非常大

    命令 作用
    pods init 创建podfile文件
    pods install 根据pofile.lock指定的版本去拉对应的依赖库
    pods update 更新依赖库(平时开发一般使用这个命令就可)

    备注:podfile类似于Android开发中在 build.gradle中指定第三方库的依赖和对应的版本的文件;
    podfile的文件内容一般为:

    #指定 pod的依赖来源方
    source 'https://github.com/CocoaPods/Specs.git'
    
    # 指定依赖的第三方库
    pod `AFNetworking`,'4.0.1'
    
    # 指定依赖的第三方库,大于某个版本
    pod '***', '~> 1.8.4.0'
    

    3 语言篇

    iOS开发一般使用ocswift来开发,需要注意的是iOS没有Android里包的概念,类的名字必须保持全局唯一,一般约定是添加特定的前缀(公司 + 项目)如WXGPUImage
    下面会以oc为例来说明

    3.1 基础语法

    • 头文件(.h)里定义的方法和变量都是公共的,源文件(.m)文件里定义的方法与变量是私有的;
    • property声明一个变量属性;
    • 类的定义从@interface开始,到 @end结束;
    • 类的实现则是从@implementation@end结束;

    对象初始化

    • [xxx new];
    • [[xxx alloc]init]; //推荐使用
      对象可变性:object-c里对象可变(类似于Java 里的final)和不可变时使用时使用的类是不一样的,以String为例子:
    • NSString :不可变;
    • NSMutableString : 可变的;
    NSString *saveKey = [NSString stringWithString:host];
    [saveKey appendString:@"|"]; //非法
    
    NSMutableString *saveKey = [NSMutableString stringWithString:@"123"];
    [saveKey appendString:@"|"]; //合法
    

    变量时的原子性(线程安全)

    • atomic 默认的,只保证值有效,不保证这个值是什么;
    • nonatomic,不保证你读到的是什么值;

    变量的内存相关:

    • weak,弱引用,不对所赋值对象进行持有,但是是安全的,对象不可用时,会被置为nil;
    • strong,对新对象进行强引用,释放旧对象,其引用计数+1,用在ARC中,用于对象或指针类型的数据类型
    • retain 对新对象进行强引用,释放旧对象,其引用计数+1,用在MRC中;
    • assign,直接赋值,和引用计数无关,用于声明基本类型,如int;
    • copy,在实现Setter方法时,采用copy函数,会生成新的对象被自己持有,一般用来修饰 NSString;
    • unsafe_unretained,弱引用,和weak不同的是,若引用对象不可用,当前指针不会被置为nil,会产生野指针;
    @interface WSDemoObject : NSObject
    //定义一个属性 @property(原子性,内存性)
    @property (nonatomic, assign) NSInteger index;
    
    // 构造方法
    - (instancetype)initWithSymbolString:(NSString *)symbol;
    
    // 静态方法
    + (void)callSomething;
    
    @end
    

    3.2 文件类型

    iOS中新建一个文件(类)时,文件类型一般会有以下四种类型:

    • protocol,协议,类似于java的接口 (并且协议里方法可以选择是否是必须的,如果不是必须的,可使用关键字optional进行标识);
    • Extention,扩展 ,对某个类的功能进行扩展,需要拥有源码,生效于编译期;
    • category,分类,也是对类的功能进行扩展,生效于运行期(可用于扩展系统类,只能扩展方法);
    • 其他,正常的类文件;
    //定义一个protocol
    @protocol  NsCopying
    - (id) copyWithZone : (NSZone *) zone
    @end
    
    //采用协议,类似于Java的实现接口
    @interface Car :NSObject<NsCopying,NSCoding>
    {  // something
    }
    @end
    
    NS_ASSUME_NONNULL_BEGIN
    //Category,扩展AppDelegate的方法
    @interface AppDelegate (WSTest)
    - (id) copyWithZone : (NSZone *) zone
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    NS_ASSUME_NONNULL_BEGIN
    //Extension,扩展AppDelegate的方法,小括号里无内容
    @interface AppDelegate ()
    - (id) copyWithZone : (NSZone *) zone
    @end
    
    NS_ASSUME_NONNULL_END
    

    3.3 单例

    使用object-c来编写一个单元测试的用例:

    //类定义
    @interface Singleton : NSObject
    +(instancetype) shareInstance;
    @end
    
    //类实现
    # import "Singleton.h"
    @implementation Singleton
    +(instancetype) shareInstance
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
        });
        return _instance;
    }
    

    4 iOS篇

    4.1 生命周期

    iOS应用的生命周期的管理主要是通过AppDelegate来完成的,生命周期方法主要有:

    • applicationWillEnterForground ; //应用即将进入前台

    • applicationDidBecomeActive; //应用变成活跃

    • applicationWillResignActive;

    • applicationDidEnterBackground ;//应用即将进入后台

    • applicationWillTerminate ; // 应用程序即将终止的回调;

    iOS中页面是由Controller构造出来的,类似于AndroidActivity,其关键的生命周期为:

    4.2 工程文件

    iOS的工程是通过配置把项目的各个文件管理起来的,每个文件都会有一个唯一编号。新增代码文件时,IDE会自动在工程文件project.pbxproj里给代码文件增加(修改)其对应编号。一般情况下是不需要手动去编辑project.pbxproj 文件,通过Xcode的选项buildsettingbuild Phases就可修改project.pbxproj了。但如果遇到协同开发,代码有冲突时,则需要直面该文件,并谨慎修改它。
    project.phxproj 文件

    - project.pbxproj
    - info.plist 工程描述文件
    

    PS:这里为什么会把工程文件单独拉出来呢?协同开发时,解冲突最麻烦了,而iOS里的工程文件冲突最不好解了,稍微不注意就会解错导致编译不了

    4.3 第三方依赖

    Android工程中,有两种方式来依赖第三方的库:一种是通过直接把第三方库(.aar,.jar)放到library目录,并在工程的gradle文件里指定要编译的library目录下的文件,另一种就是直接在gradle文件里写要依赖的第三方库,如

    dependencies{
    	implementation 'com.tencent.qapm:abc:1.5.4' // 依赖abc库的 1.5.4版本
    }
    
    

    类似的,在iOS工程里也有两种依赖第三方库的方法:一种是直接直接把第三方库(.a,.framework)放到工程目录中,并在buildsetting里引用这些库,另一种就是使用pod依赖了;

    有一个点需要注意:在集成第三方库时,要特别留意符号冲突(因为iOS是可以对类进行扩展的,如果有两个库同时对一个公共类进行了扩展,并且扩展的方法是一样的,则有可能会发生运行时错误),一般建议如果是对公共的类或库进行扩展时,扩展的方法名也带上前缀,这样可以避免很多坑;

    iOS中的第三方库有两种形态:

    • 静态库,后缀为(.a,.framework)
    • 动态库,后缀为(.dylib,.framework)

    静态库与动态库的区别主要在于在打包链接时的操作不一样;

    4.3.1 静态库

    静态库在打包生成可执行的目标文件时,会把汇编生成的目标文件.o与引用的库一起链接打包到目标文件中,静态库的特点:

    • 在编译期完成对函数库的链接
    • 运行时与函数库不再有关,可独立运行;
    • 会比较占用空间(如果有函数库被多个静态库依赖,则这个函数库里会有多份拷贝)
    • 更新麻烦,如果静态库A更新了,则所有依赖静态库A的库都需要重新编译,更新;
    • 加载速度较动态库快

    4.3.2 动态库

    动态库与静态库类似,只是在打包时不用把所链接的文件全部拷贝进目标文件中,只是拷贝一些重定位和符号信息,这些信息在运行时可完成真正的链接,动态库的特点:

    • 在运行时完成对函数库的链接(不同应用程序调用相同的库,在内存里只需要有一份该库的实例);
    • 运行时与函数库有关,需要依赖对应的函数库才可运行;
    • 会比较省空间(只需要拷贝少量的符号与链接信息)
    • 更新简单,只需要更新对应的动态库就可以了;
    • 可以用来实现进程之间的资源共享;
    • 加载速度较静态库慢;

    5 View篇

    这里主要列举几个常用的UI控件

    Android iOS
    View(ViewGroup) UIView
    TextView UILabel
    Button UIbutton
    ImageView UIImageView
    ListView(RecyclerView) UITableView(UICollectionView)
    ScrollView UIScrollView

    这五个主要View可以覆盖到80%的业务需求了,具体的用法可在使用到时自行搜索,这里就不再一一列举。

    在创建一个Helloword的 Demo时可直接利用Xcode创建项目的选项,一步步按照操作进行就可以了;虽然iOS也可以在.storyboard文件里进行界面的编写,但绝大部分时候都是需要使用代码来创建界面的,主要是在创建好的ViewControllerviewDidLoad方法里加入View来显示内容,eg:

    //ps:代码是swift的,oc的代码也是类似的,只是语法有稍微的区别
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            let copyButton = UIButton(type:.custom)
            copyButton.setTitle("Hello World", for: .normal)
            //设置颜色
            copyButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 13)
            copyButton.backgroundColor = UIColor.blue
            //设置大小(边界),关键(告诉系统在哪里绘制这个View)
            copyButton.frame = CGRect.init(x: 0, y: 100, 240, height:240)
            //addTarget方法用来设置一些事件的处理,类似于Android的 addClickListener
            // action 用来响应该事件的方法
            // for : 要监听处理哪些事件
            copyButton.addTarget(self, action: #selector(defaultButtonPressed), for: UIControl.Event.touchUpInside)
            //把View加入到界面中
            self.view.addSubview(copyButton)
            }
    

    6参考

  • 相关阅读:
    详解GaussDB(for MySQL)服务:复制策略与可用性分析
    华为云的研究成果又双叒叕被MICCAI收录了!
    充分释放数据价值:安全、可信6到飞起
    未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布
    一文带你掌握OBS的两种常见的鉴权方式
    数据库实践丨MySQL多表join分析
    技术贴丨教你使用华为云鲲鹏服务器部署Discuz!论坛
    python Scrapy 从零开始学习笔记(二)
    python Scrapy 从零开始学习笔记(一)
    从零开始学Electron笔记(七)
  • 原文地址:https://www.cnblogs.com/WoodJim/p/14719481.html
Copyright © 2011-2022 走看看