Tag: iOS

  1. A interesting inheritance question between self and super

    Here is a inheritance chain relationship: NSObject -> RootCls -> SubCls Think About a question? What will the followed code to be printed? @implementation SubCls - (void)print { NSLog(@"%@",[self class]); NSLog(@"%@",[self superclass]); NSLog(@"%@",[super class]); NSLog(@"%@",[super superclass]); } @end Ordinary, the wrong answer may look like…

    on iOS

  2. Objective-C - a NSObject

    Mitchell Convert OC to C++ Transformation way: We can assign the platform to iphoneos with arm64 architecture, while it will output with multi platform architecture automatically. //It will automatically generate main.cpp file xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m //Assign your output file name xcrun -sdk iphoneos…

    on iOS

  3. iOS - autoreleasepool and @autoreleasepool

    Mitchell 一、自动释放池 官网关于自动释放池的说明:NSAutoreleasePool 类被用来支持自动引用计数内存管理系统。一个自动释放池存储的对象当自己被销毁的时会向其中的对象发送 release 消息。 1、Overview + 在一个自动引用计数的环境中(并不是垃圾回收机制),一个包含了多个对象的 NSAutoreleasePool 对象能够接收 autorelease 消息并且当销毁它的时候会对每一个池子中的对象发送 release 消息。因此,发送 autorelease 而不是 release 消息延长了对象的生命周期直到 pool 被清空的时候(当对象被保留的时候会更久)。一个对象能够被放到同一个池子中许多次,在这种情况下每放一次都会收到一个 release 消息。 在引用计数的环境中,Cocoa 期望有一个自动释放池能够保持有效。如果一个池子没有用了,需要自动释放的对象没有被释放从而会造成内存泄漏。在这种情况下,你的程序将会报错。 Application Kit 在事件循环开始的时候在主线程创建了一个自动释放池,并且在结束的时候去清空它,从而释放所有进程事件中生成的自动释放的对象。如果使用了 Application Kit ,就没必要再去创建自己的自动释放池。然而,…

    on iOS

  4. iOS - MitRegx

    MitRegx,这个小轮子写了很长时间了,感觉还算比较实用。 一、困扰 以往我们在登录注册的时候要去校验诸如账号、密码和验证码的一些格式是否正确,可能会写出如下的代码: if (账号的格式正确&&密码的格式正确&&验证码的格式正确){ [发送网络请求进行下一步] } 这样的代码看上去很难受。 二、函数式编程 那个时候用 Masonry,体会了函数式编程的好处: 代码简洁 易于理解 方便代码管理 MitRegx MitRegx 分4个部分 MitRegx.h 头文件,便于类的导入。 MitRegxConst.h ,这个类中存放了一些错误状态的常量。 MitRegexMaker.h 核心逻辑处理类,在这里对通用的验证逻辑进行处理。 /** 校验状态 */ @property(nonatomic, assign)MitRegexStateType status; /** 返回状态文本 */ @property(nonatomic, strong)…

    on iOS

  5. iOS - Dissecting objc_msgSend on ARM64

    Auther:Mike Ash 总览 每一个 OC 对象都有一个类,并且每个 OC 类都有一个方法列表。每个方法都有一个指向实现的函数指针和一些元数据的选择器。objc_msgSend 的任务是把对象和选择器传入并查找相应方法的函数指针,然后跳转到这个函数指针指向的位置。 查找方法的过程是很复杂的。如果一个方法没有在一个类上被找到,之后它需要在父类中继续寻找。如果父类都没有找到,就需要调用运行时消息转发。如果这是指定类第一次接受消息,那么它将调用那个类的 +initialize 方法。 通常查找一个方法也需要非常的迅速,因为它需要被每个方法所调用。当然,这与复杂的查找过程是相冲突的。 Objective-C 对于这个冲突的解决方式是方法缓存。每个类有一个缓存,它将方法存储为选择器和函数指针对。在 Objective-C 中被称为 IMPs。它们为了被查找的更快被组成了一个哈希表。当需找一个方法时,首先会查询缓存,如果方法没在缓存中,它会遵循缓慢且复杂的过程,之后将查找的结果放入缓存以便于下一次能够更快的查找。 objc_msgSend 是使用汇编写的,有两点原因:一点是在 C 中不可能来写一个函数保存未知的参数并且可以去跳转到任意的函数指针。C…

    on iOS

  6. iOS - AOP Program for iOS

    Mitchell 一、AOP 简介 AOP(Aspect Oriented Programming) 通常译为 面向切面编程。在工程中常用来分离具体的业务逻辑,个人理解为从不同维度来增加新的业务逻辑,这样在不影响之前功能的前提下可以将新的业务逻辑从某一切面中嵌入工程,达到低耦高聚的目的。 二、在 iOS 工程中的使用 传统统计功能(打点): 在工程中产品经理往往都会有统计用户行为的需求,通常第三方服务提供商或多数公司常规的做法是按照标识位(不同事件 ID/eventID)来进行用户行为事件统计,在每一个需要统计的位置插入标记,并记录在文件中,之后按照不同的上传策略将文件上传,后台通过解析事件 ID 来绘制统计数据图。 问题: 如果按照以上方法来做,代码层面会出现类似以下情景: /*viewControllerOne*/ @implemention ViewControllerOne() - (void)viewWillAppear{ [super viewWillAppear]; [MITStat statForEventID:@1 message:@"ViewControllerOne viewWillAppear"]; } @end…

    on iOS

  7. iOS - Add apple document

    一、安装过程 第一步:下载安装 git clone git://github.com/tomaz/appledoc.git cd ./appledoc sudo sh install-appledoc.sh 稍等一会,安装OK。 + 第二步:安装验证: appledoc --version 二、使用 第一步:进入代码所在文件夹:(你忘了?好吧我告诉你怎么进),进入终端: cd + “文件夹目录” 第二步: name:项目名称 company:公司名称 这俩个自己可以替换一下 appledoc --project-name MyProject --project-company ibireme ./ 之后你会看到你的文件夹下会多出一个文件,稍后会说这个文件的作用: 如果想了解更多,可以查看帮助: appledoc --help…

    on iOS