文档章节

Objective-C 源码(零):前戏

神补刀
 神补刀
发布于 2015/11/10 16:24
字数 519
阅读 126
收藏 0

    趁着最近比较闲,可以再次研究一下Objective-C的源代码,顺便梳理一下思路,愿有更大收获。

    Objective-C是一门面向对象的程序设计语言。它的对象模型是基于类来创立的。源码可以在苹果开源的runtime中下载,连接是http://opensource.apple.com/tarballs/objc4/ ,自己下载了个objc4-647.tar.gz 版本。

    看源码能学到很多东西,特别是runtime原理,如果想学好,但是又懒的自己看源码,只是局限于看大神的博客里面的一些他们看完源码之后写的感悟,收获是微乎其微的,至少是一知半解,所以,还是别偷懒,乖乖自己撸一发吧。

    先说一点看OC前需要准备的知识:

    Class:

    可以看到Class其实是一种指针类型,即用于指向objc_class结构体。NSObject中定义的方法- (Class)class;用于返回其对应的objc_class结构体指针。

    SEL

    typedef struct objc_selector *SEL;

    其实它就是个映射到「方法」的C字符串,可以用Objc编译器命令@selector()或者Runtime系统的sel_registerName函数来获得一个SEL类型的「方法选择器」(通常简称「选择子」)。

    考虑到Xcode对@selector的支持比对sel_registerName的支持更好,所以@selector貌似用得更多一些,但有时候sel_registerName或许更简洁一些。

    另外,使用@selector()寻找某个方法的时候,如果方法没有实现,编译器会警告,如果使用的是sel_registerName则没有警告。

    Method:

typedef
 
struct
 objc_method *Method;


    Ivar:

typedef
 
struct
 objc_ivar *Ivar;


    Category:   

typedef
 
struct
 objc_category *Category;


    objc_property_t:

 typedef
 
struct
 objc_property *objc_property_t;

    可以通过class_copyPropertyList和protocol_copyPropertyList方法来获取类(Class)和协议(Protocol)中的属性,获取属性之后,还可以使用property_getName获取属性的名字(C字串):这个在一些博客的黑魔法里面也用到了,就是给category增加成员变量。

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount);
const char *property_getName(objc_property_t property);










    主要参考博客:http://zhangbuhuai.com/2015/04/26/unstanding-the-Objective-C-Runtime-part1/ 

© 著作权归作者所有

神补刀
粉丝 19
博文 78
码字总数 38937
作品 0
广州
程序员
私信 提问
C/C++编译器--clang

Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 Clang 开发事出有因,Wiki 介绍如下: Apple 使用 ...

匿名
2012/01/13
36.2K
1
FreeBSD 10 将使用 Clang 编译器替换 GCC

来自 phoronix 的消息称,根据 FreeBSD 2012 第一季度的状态报告 显示,来自 LLVM 的 Clang 编译器将成为 FreeBSD 10 的默认 C/C++ 编译器,废弃使用 GPL 授权协议的 GCC,而 Clang 的授权协...

oschina
2012/05/13
5K
16
《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言 原创文章,欢迎转载。转载请注明:关东升的博客 在Swift语言出现之前,开发iOS或OS X应用主要使用Objective-C...

智捷课堂
2016/02/24
25
0
Objective C学习笔记

1、代码文件类型: (1)、[.h]头文件 (2)、[.m]c代码 (3)、[.mm]c++代码 2、调用头文件的方法#import,且只在没有调用过的时候调用一次,类似于PHP的require_once。 3、字符串NSString 通过@...

xiejuntao
2014/10/02
0
0
JavaScriptCore框架在iOS7中的对象交互和管理

之前一篇的文章中已经简单入门了iOS7中新加的JavaScriptCore框架的基本用法,十分的简单方便而且高效,不过也仅限于数值型、布尔型、字符串、数组等这些基础类型。本文将扩展到更复杂的类型,...

北方人在上海
2016/03/28
30
0

没有更多内容

加载失败,请刷新页面

加载更多

lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
49分钟前
3
0
通过四道常问面试题,带你了解什么是数据库分库分表

编者语:为了避免被误解为:「手里有把锤子,看什么都是钉子!」,说明一下不是什么业务都适合分布式数据库,更不是用了分布式数据库性能就一定能得到扩展。 其次:本文为纯干货,建议先转发...

老道士
今天
5
0
springmvc 整体流程

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR......

architect刘源源
今天
3
0
磁盘管理

先来看两个查看的命令 查看磁盘使用情况df 用法:df, df -h, df -m, df -k 查看目录或文件大小 用法:du -sh, du -sm, du -s(默认以k为单位) 新加一块盘如何操作 步骤:分区(可选)--> 格...

wzb88
今天
3
0
在 Linux 下确认 NTP 是否同步的方法

NTP 意即网络时间协议Network Time Protocol,它通过网络同步计算机系统之间的时钟。NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业。NTP 客户端会将其时钟与 ...

Linux就该这么学
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部