分类 Xcode 下的文章

在 2011 年 WWDC(苹果全球开发者大会)的一场与 Objective-C 相关的讲座上,开发者的人生观被颠覆了。
作为一个开发者,管理好自己程序所使用的内存是天经地义的事,好比人们在溜狗时必须清理狗的排泄物一样(美国随处可见“Clean up after your dogs”的标志)。在本科阶段上 C 语言的课程时,教授们会向学生反复强调:如果使用 malloc 函数申请了一块内存,使用完后必须再使用 free 函数把申请的内存还给系统——如果不还,会造成“内存泄漏”的结果。这对于 Hello World 可能还不算严重,但对于庞大的程序或是长时间运行的服务器程序,泄内存是致命的。如果没记住,自己还清理了两次,造成的结果则严重得多——直接导致程序崩溃。
Objective-C 有类似 malloc/free 的对子,叫 alloc/dealloc,这种原始的方式如同管理C内存一样困难。所以 Objective-C 中的内存管理又增加了“引用计数”的方法,也就是如果一个物件被别的物件引用一次,则引用计数加一;如果不再被该物件引用,则引用计数减一;当引用计数减至零时,则系统自动清掉该物件所占的内存。具体来说,如果我们有一个字符串,当建立时,需要使用 alloc 方法来申请内存,引用计数则变成了一;然后被其他物件引用时,需要用 retain 方法去增加它的引用计数,变成二。当它和刚才引用的物件脱离关联时,需使 release 方法减少引用计数,又变回了一;最后,使用完这个字符串时,再用 release 方法减少其引用计数,这时,运行库发现其引用计数变为零了,则回收走它的内存。这是手动的方式。
这种方式自然很麻烦,所以又设计出一种叫做 autorelease 的机制(不是类似 Java 的自动垃圾回收)。在 Objective-C 中,设计了一个叫做 NSAutoReleasePool 的池,当开发者需要完成一个任务时(比如每开启一个线程,或者开始一个函数),可以手动创立一个这样的池子, 然后通过显式声明把物件扔进自动回收池中。NSAutoReleasePool 内有一个数组来保存声明为 autorelease 的所有对象。如果一个对象声明为 autorelease,则会自动加到池子里。如果完成了一个任务(结束线程了,或者退出那个函数),则开发者需对这个池子发送一个 drain 消息。这时,NSAutoReleasePool 会对池子中所有的物件发送 release 消息,把它们的引用计数都减一 ——这就好比游泳池关门时通知所有客人都“滚蛋”一样。所以开发者无需显式声明 release,所有的物件也会在池子清空时自动呼叫 release 函数,如果引用计数变成零了,系统才回收那块内存。所以这是个半自动、半手动的方式。
---《Mac OS X 背后的故事》



title: CocoaPods
date: 2016-10-26 10:37:38
tags: Cocoapods
category: iOS
id: 3

  • .podspec文件是做什么的
.podspec文件描述了一个库将怎样被添加进工程中。.podspec文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。
  • Podfile 文件的自述
  Podfile是用于配置项目所需要的第三方库的地方,使用格式如下:
  platform :ios, '7.0'
  target 'xxx' do
      pod 'AFNetworking', '~> 3.1.0'
      ## react-native (引用本地文件)
      pod 'React', :path => './node_modules/react-native', :subspecs => [
          'Core',
      ]
  end



title: cocoapods-library-create
date: 2018-08-15 14:48:36
tags: cocoapods

categories: cocoapods

readme文件如何添加
Liberapay patrons这种说明

  1. 打开网站https://shields.io/#/examples/funding
  2. 选择flat Style
  3. 在Link和Image中输入http://img.shields.io/cocoapods/v/库名称.svg,网站会自动解析库的版本,生成img
  4. copy下面的Markdown,paste到要显示说明的地方

Xcode Code Snippets
在Double Encore,我们写的代码都是干净,可重用的——不过,有时候并不能完全做到。如在使用pragma mark的时候。下面就是一个示例:
#pragma mark - UIViewController overrides
通过pragma mark,可以让代码看起来既整洁又有组织。虽然这很重要,但是会带来额外的输入操作和时间。此时,我们可以使用code snippets。
通过code snippets,我们可以创建一些可重用的代码块,并且在任何需要的地方很容易的就可以使用这些代码块。这可以节省输入需要的操作和时间。并且,一旦你学会使用code snippets,会发现你可以创建并扩充自己的code snippet library。
创建一个code snippet非常简单。首先,打开Xcode并在utilities panel中选择code snippet library。
上图中,可以看到在code snippet library中已经有一些数据了。
接着,输入希望创建的code snippet。在这里,我为pragma mark创建一个code snippet。如下图所示,在代码编辑器中输入 “#pragma mark – UIViewController overrides”。
选中代码块,如下图所示:
然后单击并按住代码块,知道文本光标变为箭头光标。接着将代码块拖放到code snippet library中,然后松开鼠标。如下图所示
此时会弹出一个popover,通过该popover可以对新的code snippet进行编辑,如下图所示。
首先,是定snippet的名字。这里我指定为“Pragma Mark”
然后,指定该snippet的completion shortcut(可选项)。这里我指定为“pm”。这样设置以后,在Xcode的代码编辑器中只需要输入快捷方式(pm),就能简单的将这个snippet添加到代码中。非常有用!
接着,可以看到在上面的示例中,pragma mark的标题是“UIViewController overrides”,不过我们是希望对其修改一下,以能够很容易的输入任意标题。
我们可以简单的将code snippet包含的文本内容修改为“#pragma mark – “即可。不过,这里还有更好的一个办法——将文本块封装到“<#” 和 “#>”中间,这样code snippet将指出我们可以插入自定义文本的完整范围。
下面,将“UIViewController overrides”替换为“<#Title#>”。
注意,completion scopes字段在这里并没有做修改,通过该字段可以指定completion shortcut的有效范围。
最后,点击edit按钮,以完成snippet的编辑。之后可以在这个popover画面中看到最终结果的一个预览效果。
然后点击popover中的done按钮。下面,你可以将我们在代码编辑器中为创建snippet而写入的文本行删除掉。
现在来试用一下刚刚创建的snippet!有两种方法。第一种是在code snippet library中找到snippet,然后用鼠标将其拖拽到代码编辑器中…
...然后松开鼠标。
一旦将snippet拖放到代码编辑器之后,就可以通过点击键盘上的tab键在不同的completion字段间移动焦点。
第二种方法是在代码编辑器里简单的输入completion shortcut中设置的内容即可。我们这里是“pm”。
然后点击键盘中的return键,就可以将snippet插入到代码编辑器中。
很简单吧!现在你已经知道如何创建自己的snippet了,你将发现这非常的有用。任何时候,你都遇到重复输入的相同代码块,都可以考虑将其添加到你的code snippets library中。
下面是我经常使用到的一些snippet:
Title: Animation Block
Completion Shortcut: ab
Completion Scopes: Function or Method
void (^<#Title#>)(void) = ^{ };
Title: Animation Completion Block
Completion Shortcut: acb
Completion Scopes: Function or Method
void (^<#Title#>)(BOOL) = ^(BOOL finished) { };
Title: Notification Add
Completion Shortcut: na
Completion Scopes: Function or Method
[[NSNotificationCenter defaultCenter] addObserver:<#Observer#> selector:<#Selector#> name:<#Name#> object:<#Object#>];
Title: Notification Remove
Completion Shortcut: nr
Completion Scopes: Function or Method
[[NSNotificationCenter defaultCenter] removeObserver:<#Observer#> name:<#Name#> object:<#Object#>];
Title: NSLog
Completion Shortcut: log
Completion Scopes: Function or Method
NSLog(@"<#Log#>");
Title: Private Interface
Completion Shortcut: pi
Completion Scopes: Top Level
@interface <#Title#> ()
@end
Title: Property Assign
Completion Shortcut: pa
Completion Scopes: All
@property (assign, nonatomic)
Title: Property Strong
Completion Shortcut: ps
Completion Scopes: All
@property (strong, nonatomic)
Title: Property Unsafe Unretained
Completion Shortcut: pu
Completion Scopes: All
@property (unsafe_unretained, nonatomic)
来源http://www.cocoachina.com/industry/20130604/6336.html

Xcode 教程之调试视图层次结构
Xcode开发,当我们需要调整/检查UI时正确的处理方式是什么?
答案:debug view hierarchy
debug view hierarchy
P.s. 下面是为什么要使用debug view hierarchy,没时间的读者自行略过
很多人知道
很多人不知道
很多人知道仅仅了解了一下
少部分的人知道了解,并经常用它辅助开发。
范子属于知道作为新功能仅仅了解了一下。包括之前的Mac软件reveal。
因为实际的开发过程中,并不是很关心UI的处理,毕竟前期要先保证业务逻辑正确,后期还有调整&测试UI的过程。
然而在这次的产品在上线之前临时提出调整UI的需求,在调整UI的过程中,让范子重新审视了一下自己画UI的过程是否合理。
其实范子之前就知道自己画UI很不用心,或者说没有给予足够的重视,在整个产品开发过程中,经常出现后期调整,耽误工程进度的情况。
这次的反思并不是因为影响进度,而是基于自身的编码习惯的反思审视。我们可以通过debug view hierarchy一次完成完美的代码布局,并以此优化自己代码布局逻辑,其实是有助于提升自己的编码水平的。
以前是因为没有合适的工具比如reveal收费昂贵。现在Xcode早就原生支持了,那么我们也就不应错过这个可以提升效率的工具。
完!