心辰·Dev

iOS 开发小记


  • 首页

  • 关于

  • 归档

  • 标签
心辰·Dev

搭建 APP 内皮肤切换框架

发表于 2016-01-23

开源方案

RNThemeManager 提供了一种优雅的方案。这种方案将主题的配色或字体配置保存在静态 Plist 中,每次切换主题时,用单例 manager 类从 Plist 配置文件中读取样式信息。然后创建了一套可更换皮肤主题的父视图控件,控件初始化时(init)在通知中心注册为观察者,监听主题切换的通知,在接到通知时,将颜色和字体更改为指定的样式。这个更换皮肤的框架非常简洁,但在成熟项目中应用,需要把已有页面中的控件都继承自那套统一的可更换皮肤的父控件,或者把自定义的 view 注册到通知中心并自己实现变化皮肤的方法,代码改动较大,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 自定义的 ViewController 或 View 遵从 RNThemeUpdateProtocol 并实现 applyTheme 方法
@interface MYViewController : UIViewController
<RNThemeUpdateProtocol>

// 在 -viewDidLoad 中注册到通知中心
[[NSNotificationCenter defaultCenter] addObserver:self action:@selector(applyTheme) withObject:nil];

// 在 -viewWillAppear (或 layout 视图的方法中)
[self applyTheme];

- (void)applyTheme {
self.view.backgroundColor = [[RNThemeManager sharedManager] colorForKey:@"backgroundColor"];
self.textField.font = [[RNThemeManager sharedManager] fontForKey:@"textFieldFont"];
self.textField.layer.cornerRadius = [RNThemeManager sharedManager].styles[@"cornerRadius"].floatValue;
}
阅读全文 »
心辰·Dev

PHP 实现 Gerrit 用户密码修改

发表于 2015-12-26

需求描述

在 Gerrit 的使用中,发现 Google 在这个框架中没有提供用户自助修改密码的功能,和 SVN 的情况相似,需要添加一个修改密码的页面。公司的 Gerrit 平台使用 HTTP Basic Authentication 方式来进行用户登录认证,由 htpasswd 命令生成的密码集中保存在一个默认的文件中。那么该页面的需求就可以细化为:对用户输入合法性做基本判断,从指定路径读取密码文件,用系统命令 htpasswd 修改密码。本文选择用 PHP 语言来实现该页面需求。

阅读全文 »
心辰·Dev

搭建 Gerrit 代码评审服务器

发表于 2015-12-04

最近入职新公司实习,随着组内成员的增加,版本控制和代码审核等团队协作方面的问题已经不是公司原有 SVN 系统所能完美解决的,于是我和小伙伴就琢磨着搭建了 GitWeb + Gerrit 服务。下面分享下搭建 Gerrit-2.11 的全过程。

前期准备

Git

1
2
$ git --version
git version 2.4.9 (Apple Git-60)
阅读全文 »
心辰·Dev

OC 内存管理机制 ARC 的底层实现

发表于 2015-11-13

ARC (Automatic Reference Counting),即主要由编译器进行自动的内存管理。 ARC 的实现需要 clang (LLVM编译器)和 objc4 Objective-C 运行时库配合进行。

__strong 修饰符的实现

使用 alloc/new/copy/mutableCopy 方法

赋值给附有 __strong 修饰符的变量:

1
2
3
{
id __strong obj = [[NSObject alloc]init];
}

将上述代码转换为汇编代码进行分析,发现实际上可简化为调用以下函数:

1
2
3
id obj = objc_msgSend(NSObject, @selector(alloc));
objc_msgSend(obj, @selector(init));
objc_realease(obj);

由此可知编译器在变量作用域结束时通过自动插入 objc_release 释放了对象。

阅读全文 »
心辰·Dev

Scheme 编程实例 | 八皇后问题

发表于 2015-09-14

问题描述

在 8 X 8 格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后不能处于同一行、同一列或同一斜线上,求这八皇后有多少种摆法。该问题可推广至 N X N 的棋盘。

解决思路

按一个方向处理棋盘,每次在每一列里放一个皇后。如果现在放好 k - 1 个皇后,第 k 个皇后就必须放在不会被已在棋盘上的任何皇后攻击的位置上。
即使用分治策略处理该问题。假定我们已经生成在棋盘的前 k - 1 列放置 k - 1 个皇后的所有可能方式,对其中每种方式,都生成将下一个皇后放在第 k 列中每一行的扩充集合。而后只留下那些符合条件的解。

阅读全文 »
心辰·Dev

NSHipster 博客干货整理 | Cocoa 框架

发表于 2015-08-14

KVC 集合操作符

  • @count: (NSNumber)集合中对象总数
  • @sum: (NSNumber)集合中数值总和
  • @avg: (NSNumber)集合中平均数
  • @max: 最大值
  • @min: 最小值

    1
    2
    [products valueForKeyPath: @"@count"];
    [products valueForKeyPath: @"@sum.price"];
  • @unionOfObjects / @distinctUnionOfObjects: 返回 key path 对应的对象数组,不去重。@distinctUnionOfObjects去重。

    1
    [inventory valueForKeyPath: @"@unionOfObjects.name"];
阅读全文 »
心辰·Dev

NSHipster 博客干货整理 | OC 基础

发表于 2015-08-10

pragma

  1. 用#pragma mark -整理代码,划分区域。
  2. 忽略 clang 的警告。

    1
    2
    3
    4
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored “-Wunused-variable”

    #pragma clang diagnostic pop
阅读全文 »
心辰·Dev

Objective-C 代码规范与最佳实践

发表于 2015-07-21

声明:本文整理自《Effective Objective-C》

Objective-C 基础

  • Objective-C 中使用消息传递机制而不是函数调用,消息传递机制是借鉴 smalltalk 语言发展而来。

  • 对象的类型在运行时被发现,编译器不关心接收消息的对象的类型,而是在运行时进行动态绑定。

  • 对象的内存始终分配在堆(heap)而不是栈(stack)中。而指向对象的指针,分配在栈(stack)中。

    阅读全文 »
心辰·Dev

A Swift Tour 习题解答

发表于 2015-05-22

Swift 初见

  • 创建一个常量,显式指定类型为 Float 并指定初始值为 4 。

    1
    let constvalue: Float = 4
  • 删除let widthLabel = label + String(width)一行中的 String ,错误提示是什么?

    1
    error: cannot invoke '+' with an argument list of type '(String, Int)'
阅读全文 »
心辰·Dev

OC 内存管理技巧分析

发表于 2015-05-14

引用计数式内存管理的思考方式

  • 自己生成的对象,自己持有。
  • 非自己生成的对象,自己也能持有。
  • 不再需要自己持有的对象时释放。
  • 非自己持有的对象无法释放。
对象操作 Objective-C 方法 引用计数值
生成并持有对象 alloc/new/copy/mutableCopy 等方法 +1
持有对象 retain 方法 +1
释放对象 release 方法 -1
废弃对象 dealloc 方法 -1(归零)
阅读全文 »
123
BingXin Xue

BingXin Xue

薛冰心的博客

26 日志
13 标签
github weibo douban zhihu
© 2014 - 2017 BingXin Xue
由 Hexo 强力驱动
主题 - NexT.Muse