白雪峰酒精工程 發表於 2026-5-6 07:07:54

Android开发快速入门iOS开发概览

<p><strong>注:本文同步发布于微信公众号:stringwu的互联网杂谈</strong>   Android开发快速入门iOS开发概览</p>
<h2 id="1-前言">1 前言</h2>
<p>笔者总结了自己在拥有<code>Android</code>开发的相关基础后入门<code>iOS</code>开发时遇到的点点滴滴给其他想入门<code>iOS</code> 开发的<code>Android</code>开发的一些参考,少走一些弯路,快速上手<code>iOS</code>开发;<br>
文章会以<code>iOS</code> 和 <code>Android</code>的开发工具,语言,工程文件和启动类的对比为主线,一步步带你了解 <code>iOS</code>版本的 <code>HelloWord</code>是如何编写的;<br>
两者的主要对比概览</p>
<table>
<thead>
<tr>
<th>平台</th>
<th>IDE</th>
<th>语言</th>
<th>依赖管理</th>
<th>UI主界面</th>
<th>应用入口</th>
</tr>
</thead>
<tbody>
<tr>
<td>Android</td>
<td>Android Studio</td>
<td>java(kotlin)</td>
<td>maven</td>
<td>Activity</td>
<td>Application</td>
</tr>
<tr>
<td>iOS</td>
<td>Xcode</td>
<td>object-c(swift)</td>
<td>Cocoapods</td>
<td>Controller</td>
<td>AppDelegate</td>
</tr>
</tbody>
</table>
<h2 id="2-工具篇">2 工具篇</h2>
<p><code>iOS</code>的开发工具 <code>Xcode</code>可直接在线获取并安装,如果仅是简单的开发一个<code>HelloWorld</code>工程,则可直接新建个工程运行就可。但如果需要使用其他第三方库时,则离不开<code>Cocoapods</code>工具了;</p>
<h3 id="21-cocoapods">2.1 Cocoapods</h3>
<p><code>Cocoapods</code> 就是<code>iOS</code>开发中的<code>maven</code>,主要用于集成管理第三方的依赖库。本文仅简单介绍在<code>Mac</code>下安装 <code>Cocoapods</code>最快捷的安装方式 <code>gem install cocoapods</code> ,详细内容可参考文档cocoapods安装文档 ;<br>
安装完成后在命令行运行:<code>pod --version</code> 查看本地安装的版本就可以,几个常用的<code>pods</code>命令,这几个命令在开发中的使用概率非常大</p>
<table>
<thead>
<tr>
<th>命令</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>pods init</td>
<td>创建podfile文件</td>
</tr>
<tr>
<td>pods install</td>
<td>根据pofile.lock指定的版本去拉对应的依赖库</td>
</tr>
<tr>
<td>pods update</td>
<td>更新依赖库(平时开发一般使用这个命令就可)</td>
</tr>
</tbody>
</table>
<p>备注:<code>podfile</code>类似于Android开发中在 <code>build.gradle</code>中指定第三方库的依赖和对应的版本的文件;<br>
<code>podfile</code>的文件内容一般为:</p>
<pre><code>#指定 pod的依赖来源方
source 'https://github.com/CocoaPods/Specs.git'

# 指定依赖的第三方库
pod `AFNetworking`,'4.0.1'

# 指定依赖的第三方库,大于某个版本
pod '***', '~&gt; 1.8.4.0'
</code></pre>
<h2 id="3-语言篇">3 语言篇</h2>
<p><code>iOS</code>开发一般使用<code>oc</code>或 <code>swift</code>来开发,<em><strong>需要注意的是<code>iOS</code>没有<code>Android</code>里包的概念,类的名字必须保持全局唯一,一般约定是添加特定的前缀(公司 + 项目)如<code>WXGPUImage</code></strong></em><br>
下面会以<code>oc</code>为例来说明</p>
<h3 id="31-基础语法">3.1 基础语法</h3>
<ul>
<li>头文件(<em>.h)里定义的方法和变量都是公共的,源文件(</em>.m)文件里定义的方法与变量是私有的;</li>
<li><code>property</code>声明一个变量属性;</li>
<li>类的定义从<code>@interface</code>开始,到 <code>@end</code>结束;</li>
<li>类的实现则是从<code>@implementation</code> 到 <code>@end</code>结束;</li>
</ul>
<p><em><strong>对象初始化</strong></em></p>
<ul>
<li>;</li>
<li>[init]; //推荐使用<br>
<strong>对象可变性:object-c里对象可变(类似于Java 里的final)和不可变时使用时使用的类是不一样的,以String为例子:</strong></li>
<li>NSString :不可变;</li>
<li>NSMutableString : 可变的;</li>
</ul>
<pre><code class="language-object-c">NSString *saveKey = ;
; //非法

NSMutableString *saveKey = ;
; //合法
</code></pre>
<p><em><strong>变量时的原子性(线程安全)</strong></em>:</p>
<ul>
<li>atomic 默认的,只保证值有效,不保证这个值是什么;</li>
<li>nonatomic,不保证你读到的是什么值;</li>
</ul>
<p><em><strong>变量的内存相关:</strong></em></p>
<ul>
<li>weak,弱引用,不对所赋值对象进行持有,但是是安全的,对象不可用时,会被置为nil;</li>
<li>strong,对新对象进行强引用,释放旧对象,其引用计数+1,用在ARC中,用于对象或指针类型的数据类型</li>
<li>retain 对新对象进行强引用,释放旧对象,其引用计数+1,用在MRC中;</li>
<li>assign,直接赋值,和引用计数无关,用于声明基本类型,如int;</li>
<li>copy,在实现Setter方法时,采用copy函数,会生成新的对象被自己持有,一般用来修饰 NSString;</li>
<li>unsafe_unretained,弱引用,和weak不同的是,若引用对象不可用,当前指针不会被置为nil,会产生野指针;</li>
</ul>
<pre><code class="language-object-c">@interface WSDemoObject : NSObject
//定义一个属性 @property(原子性,内存性)
@property (nonatomic, assign) NSInteger index;

// 构造方法
- (instancetype)initWithSymbolString:(NSString *)symbol;

// 静态方法
+ (void)callSomething;

@end
</code></pre>
<h3 id="32-文件类型">3.2 文件类型</h3>
<p>在<code>iOS</code>中新建一个文件(类)时,文件类型一般会有以下四种类型:</p>
<ul>
<li>protocol,协议,类似于java的接口 (并且协议里方法可以选择是否是必须的,如果不是必须的,可使用关键字<code>optional</code>进行标识);</li>
<li>Extention,扩展 ,对某个类的功能进行扩展,需要拥有源码,生效于编译期;</li>
<li>category,分类,也是对类的功能进行扩展,生效于运行期(可用于扩展系统类,只能扩展方法);</li>
<li>其他,正常的类文件;</li>
</ul>
<pre><code class="language-object-c">//定义一个protocol
@protocolNsCopying
- (id) copyWithZone : (NSZone *) zone
@end

//采用协议,类似于Java的实现接口
@interface Car :NSObject&lt;NsCopying,NSCoding&gt;
{// 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
</code></pre>
<h3 id="33-单例">3.3 单例</h3>
<p>使用<code>object-c</code>来编写一个单元测试的用例:</p>
<pre><code class="language-object-c">//类定义
@interface Singleton : NSObject
+(instancetype) shareInstance;
@end

//类实现
# import "Singleton.h"
@implementation Singleton
+(instancetype) shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&amp;onceToken, ^{
    _instance = [ init];
    });
    return _instance;
}
</code></pre>
<h2 id="4-ios篇">4 iOS篇</h2>
<h3 id="41-生命周期">4.1 生命周期</h3>
<p><code>iOS</code>应用的生命周期的管理主要是通过<code>AppDelegate</code>来完成的,生命周期方法主要有:</p>
<ul>
<li>
<p>applicationWillEnterForground ; //应用即将进入前台</p>
</li>
<li>
<p>applicationDidBecomeActive; //应用变成活跃</p>
</li>
<li>
<p>applicationWillResignActive;</p>
</li>
<li>
<p>applicationDidEnterBackground ;//应用即将进入后台</p>
</li>
<li>
<p>applicationWillTerminate ; // 应用程序即将终止的回调;</p>
</li>
</ul>
<p><code>iOS</code>中页面是由<code>Controller</code>构造出来的,类似于<code>Android</code>的 <code>Activity</code>,其关键的生命周期为:</p>
<ul>
<li>loadView : 加载View(一般使用xib构建时)</li>
<li>viewDidLoad: View 加载完毕 ;//类似于Activity.onCreate</li>
<li>viewWillAppear: View将要显示;//类似于Activity.onStart</li>
<li>viewDidAppear :View完全显示;//类似于Activity.onResume</li>
<li>viewWillDisappear:View将到消失;//类似于Activity.onPause</li>
<li>viewDidDisappear:View完全消失;//类似于Activity.onDestory</li>
</ul>
<h3 id="42-工程文件">4.2 工程文件</h3>
<p><code>iOS</code>的工程是通过配置把项目的各个文件管理起来的,每个文件都会有一个唯一编号。新增代码文件时,IDE会自动在工程文件<code>project.pbxproj</code>里给代码文件增加(修改)其对应编号。一般情况下是不需要手动去编辑<code>project.pbxproj</code> 文件,通过Xcode的选项<code>buildsetting</code> 、<code>build Phases</code>就可修改<code>project.pbxproj</code>了。但如果遇到协同开发,代码有冲突时,则需要直面该文件,并谨慎修改它。<br>
project.phxproj 文件</p>
<pre><code>- project.pbxproj
- info.plist 工程描述文件
</code></pre>
<p>PS:这里为什么会把工程文件单独拉出来呢?协同开发时,解冲突最麻烦了,而<code>iOS</code>里的工程文件冲突最不好解了,稍微不注意就会解错导致编译不了</p>
<h3 id="43-第三方依赖">4.3 第三方依赖</h3>
<p>在<code>Android</code>工程中,有两种方式来依赖第三方的库:一种是通过直接把第三方库(<code>.aar</code>,<code>.jar</code>)放到<code>library</code>目录,并在工程的<code>gradle</code>文件里指定要编译的<code>library</code>目录下的文件,另一种就是直接在gradle文件里写要依赖的第三方库,如</p>
<pre><code class="language-java">dependencies{
        implementation 'com.tencent.qapm:abc:1.5.4' // 依赖abc库的 1.5.4版本
}

</code></pre>
<p>类似的,在<code>iOS</code>工程里也有两种依赖第三方库的方法:一种是直接直接把第三方库(<code>.a</code>,<code>.framework</code>)放到工程目录中,并在<code>buildsetting</code>里引用这些库,另一种就是使用<code>pod</code>依赖了;</p>
<p>有一个点需要注意:在集成第三方库时,要特别留意符号冲突(因为iOS是可以对类进行扩展的,如果有两个库同时对一个公共类进行了扩展,并且扩展的方法是一样的,则有可能会发生运行时错误),一般建议如果是对公共的类或库进行扩展时,扩展的方法名也带上前缀,这样可以避免很多坑;</p>
<p><code>iOS</code>中的第三方库有两种形态:</p>
<ul>
<li>静态库,后缀为(.a,.framework)</li>
<li>动态库,后缀为(.dylib,.framework)</li>
</ul>
<p>静态库与动态库的区别主要在于在打包链接时的操作不一样;</p>
<h3 id="431-静态库">4.3.1 静态库</h3>
<p>静态库在打包生成可执行的目标文件时,会把汇编生成的目标文件<code>.o</code>与引用的库一起链接打包到目标文件中,静态库的特点:</p>
<ul>
<li>在编译期完成对函数库的链接</li>
<li>运行时与函数库不再有关,可独立运行;</li>
<li>会比较占用空间(如果有函数库被多个静态库依赖,则这个函数库里会有多份拷贝)</li>
<li>更新麻烦,如果静态库A更新了,则所有依赖静态库A的库都需要重新编译,更新;</li>
<li>加载速度较动态库快</li>
</ul>
<h3 id="432-动态库">4.3.2 动态库</h3>
<p>动态库与静态库类似,只是在打包时不用把所链接的文件全部拷贝进目标文件中,只是拷贝一些重定位和符号信息,这些信息在运行时可完成真正的链接,动态库的特点:</p>
<ul>
<li>在运行时完成对函数库的链接(不同应用程序调用相同的库,在内存里只需要有一份该库的实例);</li>
<li>运行时与函数库有关,需要依赖对应的函数库才可运行;</li>
<li>会比较省空间(只需要拷贝少量的符号与链接信息)</li>
<li>更新简单,只需要更新对应的动态库就可以了;</li>
<li>可以用来实现进程之间的资源共享;</li>
<li>加载速度较静态库慢;</li>
</ul>
<h2 id="5-view篇">5 View篇</h2>
<p>这里主要列举几个常用的UI控件</p>
<table>
<thead>
<tr>
<th>Android</th>
<th>iOS</th>
</tr>
</thead>
<tbody>
<tr>
<td>View(ViewGroup)</td>
<td>UIView</td>
</tr>
<tr>
<td>TextView</td>
<td>UILabel</td>
</tr>
<tr>
<td>Button</td>
<td>UIbutton</td>
</tr>
<tr>
<td>ImageView</td>
<td>UIImageView</td>
</tr>
<tr>
<td>ListView(RecyclerView)</td>
<td>UITableView(UICollectionView)</td>
</tr>
<tr>
<td>ScrollView</td>
<td>UIScrollView</td>
</tr>
</tbody>
</table>
<p>这五个主要View可以覆盖到80%的业务需求了,具体的用法可在使用到时自行搜索,这里就不再一一列举。</p>
<p>在创建一个<code>Helloword</code>的 Demo时可直接利用Xcode创建项目的选项,一步步按照操作进行就可以了;虽然<code>iOS</code>也可以在<code>.storyboard</code>文件里进行界面的编写,但绝大部分时候都是需要使用代码来创建界面的,主要是在创建好的<code>ViewController</code>的 <code>viewDidLoad</code>方法里加入View来显示内容,eg:</p>
<pre><code class="language-swift">//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, width:240, height:240)
      //addTarget方法用来设置一些事件的处理,类似于Android的 addClickListener
      // action 用来响应该事件的方法
      // for : 要监听处理哪些事件
      copyButton.addTarget(self, action: #selector(defaultButtonPressed), for: UIControl.Event.touchUpInside)
      //把View加入到界面中
      self.view.addSubview(copyButton)
      }
</code></pre>
<h2 id="6参考">6参考</h2>
<ul>
<li>静态库与动态库</li>
<li>苹果文档</li>
<li>cocoapods</li>
<li>精通iOS开发</li>
<li>图片来源</li>
</ul><br><br>
来源:https://www.cnblogs.com/WoodJim/p/14719481.html
頁: [1]
查看完整版本: Android开发快速入门iOS开发概览