cocoa_cocoapods - CSDN
精华内容
参与话题
  • Cocoa编程开发者手册,英文原版名为:Cocoa.Programming.Developers.Handbook 包含了英文原版和中文版两个文档,是关于Mac OS X上Cocoa API的指南,涵盖了从用户界面到网络编程各个方面的特性,并内置了附书源码,供...
  • Cocoa是什么???

    万次阅读 2013-10-11 10:12:26
    某次上班路上,同事问我:什么是Cocoa?当时楞了一下,对呀,什么是Cocoa?做了将近一年的iPhone应用开发,成天跟它打交道,竟然还不知道这是个什么东西。。。 一、什么是CocoaCocoa的来源 早些年,苹果公司启动...

    Cocoa是什么???

    作者:wangzz
    转载请注明出处
    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢!

    某次上班路上,同事问我:什么是Cocoa?当时楞了一下,对呀,什么是Cocoa?做了将近一年的iPhone应用开发,成天跟它打交道,竟然还不知道这是个什么东西。。。

    一、什么是Cocoa

    ①Cocoa的来源

    早些年,苹果公司启动了Copland计划,致力于开发出自己的操作系统,可惜后来Copland计划逐渐的失控了,苹果公司最终决定放弃开发,转向从别的公司购买下 一个版本的Mac OS。在经过调查现存的操作系统之后,苹果公司选择了NextSTEP,因为NeXTSTEP很小,苹果1996年收购了Next整个公司。关于Next公司以及这段历史,对乔帮主感兴趣的同学可以google一下。

    NeXTSTEP内置许多库和工具,能让程序员以一种优雅的方式与窗口管理器进行交互,这些库叫做Framework,在1993年这些frameworks和工具被重新修改并重命名OpenStep,后来被重命名为Cocoa,大家应该知道为什么Cocoa的类都有着NS的前缀了吧。

    ②什么是Cocoa

    实时上,Cocoa(IOS上的叫Cocoa Touch)是一个面向对象的软件组件—---类的集成套件,它使开发者可以快速创建强壮和全功能的 Mac OS X (IOS)应用程序。

    Cocoa包含了很多框架,其中最最核心的有两个:
    (1)Foundation框架;

    Foundation框架包含所有和界面显示无关的类。
    (2)Application Kit(AppKit)框架(Cocoa Touch中叫UIKit框架)。

    Application Kit 框架包含实现图形的、事件驱动的用户界面需要的所有对象:窗口、对话框、按键、菜单、 滚动条、文本输入框----这个列表还在不断增加。

    Foundation 和 Application Kit (UIKit)框架在 Cocoa 开发中是必要的,其它框架则是辅助和可选的(我们也可以只用 Foundation 框架创建一个 Cocoa 程序,而不涉及其它框架,比如令行工具和 Internet 服务器就是这样的例子)。和所有框架一样,这两个框架不仅包含动态共享库(有时是几个兼容版本的库),还包含头文件、API文档、和相关的资源。

    除了这两个最核心的,Cocoa(Cocoa Touch)还有很多其他的框架,苹果和第三方厂商也随时会发布更多的框架,比如Cocoa Touch的Address Book UI框架(AddressBookUI.framework)、Game Kit框架(GameKit.framework)等等,我们在开发Cocoa程序的时候可以按照自己的实际需求添加这些框架

    二、Cocoa在Mac OS X中的位置

    ①Cocoa在整个Mac OS X架构中的位置


    从这幅图中可以看出:

    (1)还有两个和Cocoa级别相同的开发框架:Carbon,JDK。
    (2)Cocoa位于整个架构的顶端,其下还依赖很多别的框架。

    虽然 Cocoa 依赖于特定的框架,但它并不是仅仅“坐”在这些框架的上面。在某些情况下,Cocoa 和其它框架(比如 Carbon)是对等的,甚至可以实现一些其它对等框架不能实现的任务Cocoa 不仅仅是基础技术上面的一个面向对象的封装层

    ②另一种层级划分方式


    上面这个图把Mac OS X的架构分了四个部分:
    (1)User Experience,这个一般可以理解为Application.
    (2)Application Frameworks,这个理解为主要包括像Cocoa这样的组件。
    (3)Graphics and Media,这个理解为Application service和Core Service。
    (4)Darwin,这个就是Mac OS X的kernel。

    ③Cocoa和其它架构的依赖关系


    Cocoa 依赖的、或者通过类和方法为之提供访问通道的主要基础框架有 Core Foundation,Carbon,Core Graphics (Quartz),Launch Services,和 Print Core (打印子系统)。详细信息如下:


    (1)Core Foundation

    Foundation 框架的很多类都基于 Core Foundation 中对应的封装类型。它们 之间的这种紧密关系使“免费桥接”技术—即在兼容的Core Foundation和Foundation类型之间实现类型转换—成为可能。某些 Core Foundation 的实现又基于 Darwin 层的 BSD 部分。

    (2)Carbon

    Cocoa 使用了 Carbon 提供的某些服务,因为有些 Carbon 框架在 Core Services 和 Application Services 层中定位为系统级别的服务。作为例子,Carbon Core 就是这些框架中特别重 要的一个,Cocoa 使用了它提供的 File Manager(文件管理器)组件来进行不同文件系统表示之间的转换。

    (3)Core Graphics

    Cocoa 描画和图像处理类(相当自然且紧密地)基于 Core Graphics 框架,它实现了 Quartz 和窗口服务器组件。
    Launch Services。NSWorkspace 类负责向外提供 Launch Services 的潜在能力。Cocoa 还使用 Launch Services 提供的应用程序注册功能来获取与应用程序及文档相关联的图标。

    (4)Print Core

    Cocoa 的打印类是打印子系统的一个面向对象的接口。

    此外,Cocoa 还使用 Carbon 环境的 Text Encoding Converter(文本编码转换器)服务来处理一些字符串编码转换。还有一些 Cocoa 方法向外提供 I/O Kit 框架、QuickDraw (QD)框架、 Apple Event (AE)框架、 和 ATS 框架的部分功能,分别用于进行电源管理、QuickDraw 描画、 Apple Event 处理、以及提供字体 支持。

    三、Cocoa程序只能通过Objective-C语言编写吗

    当然不是了。

    在开发 Cocoa 软件的时候,我们可以使用多种编程语言。基本的,也是官方推荐的语言是 Objective-C。Objective-C 拥有自己 的 Cocoa 运行环境,又是 ANSI C 的超集,它在 ANSI C 的语法和语义特性上(从 Smalltalk 派生而来)进行扩展,使之支持面向对象的编程,新增的规则简单而又易于学习和使用。由于 Objective-C 是基于 ANSI C 的,我们可以自由地将 C 代码直接和 Objective-C 代码混合在一起。而且我们的代码可以调用非 Cocoa 的编程接口中定义的所有函数,比如 Carbon 和 BSD。您甚至可以将 C++代码混合到 Cocoa 代码中,并将它们 连接在同一个执行文件中。

    同时Cocoa 还支持 Java,Cocoa 为此定义了一个平行的 Java 类库,并且实现 了一个将 Java 接口映射到 Objective-C 实现的桥机制。Cocoa 的 Java 支持使您可以将本地的 Java 对象 和 Cocoa 对象混合在一起使用(在某些限制下)。我们甚至可以用PyObjC,即Python/Objective-C桥来进行Cocoa编程。Python是一种解释性的、注重交互的、及面向对象的编程语言。PyObjC使Python对象可以向 Objective-C对象传递消息,就象传递给Python对象一样;同时还使Objective-C对象可以向Python对象传递消息。

    四、如何判断一个程序是不是Cocoa程序

    不知道同学们有没有想过这个问题。我们工作时只知道打开Xcode,新建工程,敲代码,编译运行,然后就告诉别人我刚刚写的这个就是Cocoa程序!

    是什么因素使一个程序成为 Cocoa 程序呢?肯定不是编程语言,因为在 Cocoa 开发中可以使用各种语言;也不是开发工具,因为在命令行上就可以创建 Cocoa 程序(虽然那会使开发过程变得复杂,且需要消耗大量时间)。那么,所有 Cocoa 程序的共同点是什么?是什么使它们变得与众不同?答案是这些程序都是由一些对象组成,而这些对象最终都是从 NSObject 这个根类继承下来的;还有,这些程序都是基于 Objective-C 运行时(runtime system)环境的。

    需要说明的是,上面的说法还需要做一点限制:

    首先,Cocoa 还有另一个根类,即 NSProxy。只是 NSProxy 很少用于 Cocoa 编程。其次,我们可以创建自己的根类,只是这需要很多工作(包括编写与 Objective-C 运行时环境进行交互的代码),为此花费时间可能是不值得的。

    五、除了Cocoa外还可以使用其它框架开发Mac OS X (IOS)程序吗

    答案也是肯定的。在本文的第二章节中我们说过,跟Cocoa处于同一级别的还有另外两个开发框架:Carbon和Java。我们可以使用Xcode利用Carbon模版和JDK来进行程序开发。只不过由于Cocoa的各种优点,官方并不推荐使用它们来进行开发工作,Carbon模版在iOS SDK 3.1之后的Xcode都不再提供了,JDK的API也不再更新。


    参考文档:

    Cocoa Fundamentals Guide

    https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002974-CH1-SW1


    展开全文
  • Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。1、Cocoa是什么?Cocoa是OS X和 iOS操作系统的程序的运行环境。是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中...

    Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。

    1、Cocoa是什么?

    Cocoa是OS X和 iOS操作系统的程序的运行环境。

    是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject。而且它们都是基于Objective-C运行环境的。

    1.1、Cocoa框架

    iOS中,Cocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。

    Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。

    这两个框架在系统中处于的位置如图:

    1.2、Foundation框架

    好吧,那我们看看两个框架的类组织架构图,第一个先看Foundation的,三个图,包括了Foundation所以的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的。

      


    将上图Foundation框架中的类进行逻辑分类如下:

    1. 值对象
    2. 集合 
    3. 操作系统服务 包括下面三个:文件系统和URL   进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。   线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出      一个子进程来执行其它工作或进行进度监控。
    4. 通知
    5. 归档和序列化
    6. 表达式和条件判断
    7. Objective-C语言服务

    1.3 UIKit框架

    应用程序可以通过三种方式使用UIKit创建界面
    1.   在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。
    2.   用代码创建
    3.   通过继承UIView类或间接继承UIView类实现自定义用户界面
    注:UIScrollView中还有一个UICollcetionView这个子类。

    框架类组织架构图:



    在图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。相应的核心对象,比如:UIApplication  ,UIWindow,UIView都直接或间接的从UIResponder继承。

     2、Cocoa对象

    2.1 Objective-C是面向对象的语言

    Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。

    2.2 Objective-C的优点

    Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:

    动态类-运行时确定类的对象

    动态绑定-运行时确定要调用的方法

    动态加载--运行时为程序加载新的模块

    2.3 动态能力相关的isa指针

    每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object  记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

    那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

    1. @interface NSObject <NSObject> {  
    2.      Class    isa;  
    3. }   
    不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

    1. struct NSObject{  
    2.    Class isa;  
    3.  }  
    Class是用typedef 定义的

    1. typedef struct objc_class *Class;  
    那NSObject可以这么写了

    1. struct NSObject{  
    2.   objc_class *isa  
    3. }  
    那objc_class的结构是什么样的呢?大概是这样的:

    1. struct objc_class {  
    2.      Class isa;  
    3.        
    4.      Class super_class;  
    5.        
    6.      const char *name;  
    7.        
    8.      long version;  
    9.      long info;  
    10.        
    11.      long instance_size;  
    12.      struct objc_ivar_list *ivars;  
    13.      struct objc_method_list **methodLists;   
    14.        
    15.      struct objc_cache *cache;  
    16.      struct objc_protocol_list *protocols;     
    17.  }  
    这里会看到,在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。

       为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语


    图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。


    图中的箭头都是指针的指向。

    2.4 根类 NSObject

    NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。


    2.4.1 根类和根类协议

    NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议 , NSObject协议指定了根类必须实现的接口。

    2.4.2 根类的主要方法:

    •     分配、初始化、和复制:
    alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。
    init方法是对象初始化。
    new是一个将简单的内存分配和初始化结合起来的方法。
    copy和copyWithZone:

    • 对象的保持和清理:
    retain方法增加对象的保持次数。
    release方法减少对象的保持次数。
    autorelease方法也是减少对象的保持次数,但是以推迟的方式。
    retainCount方法返回对当前的保持次数。
    dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。
    • 内省和比较

    NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法 
    superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。
    您可以通过isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。
    respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。
    conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。
    isEqual:和hash方法用于对象的比较。
    description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。

    • 对象的编码和解码

    下面的方法和对象的编解码(作为归档过程的一部分)有关:
    encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。
    NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

    • 消息的转发

     forwardInvocation:允许一个对象将消息转发给另一个对象。

    • 消息的派发 

    在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。

    2.5 Cocoa对象生命周期

    对象的四种内存管理方式,如下图所示

    •  对象的生命周期—简化视图


    • 保持接收到的对象


    • 拷贝接收到的对象


    • 自动释放池




    参考:

    1、http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf

    2、http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html

    3、http://www.cnblogs.com/csutanyu/archive/2011/12/12/Objective-C_memory_layout.html

    展开全文
  • Cocoapods的更新及使用

    千次阅读 2018-09-18 17:09:56
    早间曾经总结过一篇关于cocoapods的文章《Cocoapods的安装及简单使用》,简单尝试使用了这个管理第三方的工具,时至今日在我的项目中仍然很少使用它,随着入职新公司,新的项目启动,鉴于自己过去手动嵌入第三方的...

    早间曾经总结过一篇关于cocoapods的文章《Cocoapods的安装及简单使用》,简单尝试使用了这个管理第三方的工具,时至今日在我的项目中仍然很少使用它,随着入职新公司,新的项目启动,鉴于自己过去手动嵌入第三方的繁琐多事,遂决定使用Cocoapods管理项目基础第三方库;

    重新使用Cocoapods遇到了一些问题,主要的就是版本更新:rvm、ruby和gem的版本 可用:rvm -v    ruby -v    gem -v 命令查看,使用update --system命令更新即可;

    我们关注的是Cocoapods的版本;

    Cocoapods的更新:

     

    在梳理项目基础框架中,使用cocoapods管理第三方,但发现已经好久没有用过了(安装cocoapods之前有说过,注意源的问题),使用时提示:

    bogon:Tongqianguan huaqiang$ pod -v

    /Library/Ruby/Site/2.3.0/rubygems.rb:271:in `find_spec_for_exe': can't find gem cocoapods (>= 0.a) (Gem::GemNotFoundException)

    from /Library/Ruby/Site/2.3.0/rubygems.rb:299:in `activate_bin_path'

    from /usr/local/bin/pod:23:in `<main>'

    这个是cocoapods的版本不对;

     

    可以使用命令:

    sudo gem uninstall cocoapods

    sudo gem install cocoapods

    将cocoapods 重新安装下;

     

    不用sudo的话会报错,因为权限不够:

    bogon:Tongqianguan huaqiang$ gem install cocoapods

    ERROR:  While executing gem ... (Gem::FilePermissionError)

        You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.

     

    对于重新安装报的错误:

    ERROR:  While executing gem ... (Gem::FilePermissionError)

        You don't have write permissions for the /usr/bin directory.

    使用下边的命令:

    sudo gem install -n /usr/local/bin cocoapods

     

    之后查看cocoapods版本:

    bogon:Tongqianguan huaqiang$ pod --version

    1.4.0

     

    最后初始化下:

    bogon:Tongqianguan huaqiang$ pod setup

    如果是对接上边的不是第一次的话,更新就好:

    bogon:Tongqianguan huaqiang$ pod repo update --verbose

     

    Cocoapods的使用:

    AFNetworking举例:

    pod search AFNetworking

    建立索引

     

    关于编辑Podfile可以通过命令:vim Podfile

    虽然可以通过vim编辑器进行编辑,但我还是喜欢通过Xcode编辑它,这个随意;

    有了Podfile之后,执行pod install即可;

     

    具体的你可以:

    bogon:Tongqianguan huaqiang$ vim Podfile

    shift+:然后输入wq退出

    bogon:Tongqianguan huaqiang$ pod install

    最后在项目目录中找到Pods项目,打开编辑Podfile即可;

     

    更新第三方版本的话使用命令:pod update

    其他的使用pod install即可

     

    不妨给大家看下我的Podfile文件:

    platform :ios, '9.0'
    target 'Tongqianguan' do
        pod 'AFNetworking', '~> 3.0'
        pod 'MBProgressHUD', '~> 1.0.0'
        pod 'SVProgressHUD', '~> 2.2.0'
        pod 'MJRefresh'
        pod 'YYKit'
        pod 'YTKNetwork'
        pod 'SDWebImage', '~>3.8'
    end

     

     

    参考文章:https://www.jianshu.com/p/1711e131987d

     

     

     

     

    展开全文
  • 深入浅出Cocoa教程

    2020-07-28 23:32:42
    runtime,kvo,底层原理,是一部非常不错的数据,赚点小积分,大家自取
  • Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。1、Cocoa是什么?Cocoa是OS X和 iOS操作系统的程序的运行环境。是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中...

    Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。

    1、Cocoa是什么?

    Cocoa是OS X和 iOS操作系统的程序的运行环境。

    是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject。而且它们都是基于Objective-C运行环境的。

    1.1、Cocoa框架

    iOS中,Cocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。

    Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。

    这两个框架在系统中处于的位置如图:

    1.2、Foundation框架

    好吧,那我们看看两个框架的类组织架构图,第一个先看Foundation的,三个图,包括了Foundation所以的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的。

      


    将上图Foundation框架中的类进行逻辑分类如下:

    1. 值对象
    2. 集合 
    3. 操作系统服务 包括下面三个:文件系统和URL   进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。   线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出      一个子进程来执行其它工作或进行进度监控。
    4. 通知
    5. 归档和序列化
    6. 表达式和条件判断
    7. Objective-C语言服务

    1.3 UIKit框架

    应用程序可以通过三种方式使用UIKit创建界面
    1.   在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。
    2.   用代码创建
    3.   通过继承UIView类或间接继承UIView类实现自定义用户界面

    框架类组织架构图:



    在图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。相应的核心对象,比如:UIApplication  ,UIWindow,UIView都直接或间接的从UIResponder继承。

     2、Cocoa对象

    2.1 Objective-C是面向对象的语言

    Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。

    2.2 Objective-C的优点

    Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:

    动态类-运行时确定类的对象

    动态绑定-运行时确定要调用的方法

    动态加载--运行时为程序加载新的模块

    2.3 动态能力相关的isa指针

    每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object  记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

    那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

    @interface NSObject <NSObject> {
         Class    isa;
    } 
    
    不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

    struct NSObject{
       Class isa;
     }
    Class是用typedef 定义的

    typedef struct objc_class *Class;
    
    那NSObject可以这么写了

    struct NSObject{
      objc_class *isa
    }
    那objc_class的结构是什么样的呢?大概是这样的:

    struct objc_class {
         Class isa;
         
         Class super_class;
         
         const char *name;
         
         long version;
         long info;
         
         long instance_size;
         struct objc_ivar_list *ivars;
         struct objc_method_list **methodLists; 
         
         struct objc_cache *cache;
         struct objc_protocol_list *protocols;   
     }
    这里会看到,在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。

       为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语


    图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。


    图中的箭头都是指针的指向。

    2.4 根类 NSObject

    NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。


    2.4.1 根类和根类协议

    NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议 , NSObject协议指定了根类必须实现的接口。

    2.4.2 根类的主要方法:

    •     分配、初始化、和复制:
    alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。
    init方法是对象初始化。
    new是一个将简单的内存分配和初始化结合起来的方法。
    copy和copyWithZone:

    • 对象的保持和清理:
    retain方法增加对象的保持次数。
    release方法减少对象的保持次数。
    autorelease方法也是减少对象的保持次数,但是以推迟的方式。
    retainCount方法返回对当前的保持次数。
    dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。
    • 内省和比较

    NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法 
    superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。
    您可以通过isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。
    respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。
    conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。
    isEqual:和hash方法用于对象的比较。
    description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。

    • 对象的编码和解码

    下面的方法和对象的编解码(作为归档过程的一部分)有关:
    encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。
    NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

    • 消息的转发

     forwardInvocation:允许一个对象将消息转发给另一个对象。

    • 消息的派发 

    在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。

    2.5 Cocoa对象生命周期

    对象的四种内存管理方式,如下图所示

    •  对象的生命周期—简化视图


    • 保持接收到的对象


    • 拷贝接收到的对象


    • 自动释放池




    参考:

    1、http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf

    2、http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html

    3、http://www.cnblogs.com/csutanyu/archive/2011/12/12/Objective-C_memory_layout.html

    容芳志 (http://blog.csdn.net/totogo2010)

    本文遵循“署名-非商业用途-保持一致”创作公用协议

    展开全文
  • Cocoa

    2014-05-22 19:49:13
    Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。 苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。主要的开发语言为 Objective-...
  • cocoa

    2019-07-30 16:19:09
    Cocoa Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。 苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。主要的开发语言为 ...
  • 本文描述了Cocoa中设计模式的主要实现,主要关注模型(Model) - 视图(View) - 控制器(Controller)和对象建模。 本章的主要目的是让您更深入地了解Cocoa的设计模式,并鼓励您在自己的软件项目中利用这些模式。
  • [奥莱理] Cocoa Objective-C 开发学习手册 第4版 (英文版) [奥莱理] Learning Cocoa with Objective-C 4th Edition (E-Book) ☆ 图书概要:☆ You’ll learn how to work with the Xcode IDE, Objective-C’s ...
  • CocoaCocoa Touch区别

    千次阅读 2017-07-25 11:22:45
    CocoaCocoa Touch区别之分是本文要介绍的内容,他们共同点就是二者都包含Objective-C运行时和两个核心框架:Cocoa包含Foundation和AppKit框架,可用于开发Mac OS X系统的应用程序。Cocoa Touch包含Foundation和...
  • Cocoa (API)

    2012-02-29 09:28:57
    From: ...Cocoa is Apple's native object-oriented application programming interface (API) for the Mac OS X operating system. The related API Cocoa Touch inclu...
  • Cocoa编程开发者手册

    2019-01-08 08:03:52
    Cocoa编程开发者手册》 基本信息 作者: (美)奇斯纳尔(Chisnall,D.) 译者: 霍炬 出版社:电子工业出版社 ISBN:9787121122392 上架时间:2013-7-22 出版日期:2013 年7月 开本:16开 页码:804 版次:1...
  • Cocoa框架总结

    2015-05-25 17:01:52
    Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa...
  • iOS开发之Cocoa是什么

    2014-03-25 16:32:16
    某次上班路上,同事问我:什么是Cocoa?当时楞了一下,对呀,什么是Cocoa?做了将近一年的iPhone应用开发,成天跟它打交道,竟然还不知道这是个什么东西。。。 一、什么是CocoaCocoa的来源 早些年,苹果公司...
  • Mac OS Cocoa绑定教程

    2017-05-30 19:31:39
    Mac OS Cocoa绑定教程 - 上原文:Bindings on macOS Cocoa绑定,或简易绑定,使你从花费大量时间编写绑定代码(在MVC模式下在控制器中联接模型和视图)的工作中解脱出来,Cocoa绑定有一个简单的目标:少写代码。你...
  • iOS中的Cocoa框架大全

    2015-09-11 22:14:23
    Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa...
  • 1、 2、 3、参考资料
  • Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在...
  • Cocoa Touch 层包含的框架
1 2 3 4 5 ... 20
收藏数 58,293
精华内容 23,317
关键字:

cocoa