写在前面:
通过 Framework 可以在物理上实现 iOS 程序的模块化。
好处:
1、如果模块间接口定义的比较完善,模块化的程序具有很好的可扩展性与内聚性;
2、物理上的模块化便于开发过程的管理与测试,尤其是在程序规模相对大。
3、如果可以使用胶水语言作为粘合剂,程序可以用很少的代价适应未来的变化。
不足:
1、由于是静态库,应该不会有什么运行时的损失,但是没试验过,不确定。
2、资源的加载这部分,不知道会不会占用更多内存,没试验,不确定。
1、新建一个静态库工程:
2、删除向导所生成工程中的 Target:
删除目标前工程状态
删除目标后工程状态
3、删除旧目标对应的工程文件夹:
删除前
删除后
4、删除旧目标对应的编译设置(Product菜单| Edit Scheme命令):
点击左下角的 Manage Schemes 按钮:
选中旧的 Scheme,点击左下角的减号删除:
删除完成后,点击 OK 返回。
5、增加一个新目标。点击 “Add Target”:
在弹出的对话框中选择 Mac OS X 下的 Bundle:
如上图,给库取一个名字,保持默认的 Framework(CoreFoundation),然后点击 Finish。
6、修改新目标的工程设置。选中 TARGETS 中对应的目标, Build Settings 页:
在 Architectures 下,将”Base SDK”改为”Latest iOS”,然后将 “Architectures” 改为 “Standard”:
在 Deployment 下,将 “Mac OS X Deployment Target”改为”Compiler Default”,将 “Targeted Device Family”改为需要的,此处改成了”iPhone/iPad”,同时可以根据需要修改 “iOS Deployment Target”,此处改为了 “iOS 3.0”:
在 Linking 中,将 “Dead Code Stripping” 改为 “NO”,将 “Link with Standard Libraries” 改为 “NO”,将 “Mac-O Type” 改为 “Relocatable Object File”:
在 Packaging 中,将 “Wrapper Extention” 改为“framework”:
7、修改目标的 Info。点击 Info:
将 “Bundle OS Type Code” 改为 “FMWK”(Framework 的意思):
8、修改预编译头:
修改前
修改后
9、向工程中添加一个类(ViewController 与 Xib):
结果如下:
10、导出相关文件。选中 Target,点击 Build Phases:
点击右下角的 “Add Build Phase”:
在弹出的菜单中选择 “Add Copy Headers”,添加完成后,展开 “Copy Headers”:
点击加号:
选中需要暴露的头文件,此处我们选择 “ClassA.h”:
点击 Add 按钮完成添加:
此时,我们看到导出的文件在 Project 下,这样是不能暴露给别人使用的,将其拖动到 Public 下:
关于 Framework 的详细说明参考苹果的在线文档:http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183-SW1
11、编译项目,查看结果:
12、这是手工制作 Framework 的方法,网上有人制作了工程模版,可以直接生成 Framework 工程:
https://github.com/kstenerud/iOS-Universal-Framework
02 2012 档案
摘要: 环境: OS:Ubuntu-v11.10 x64 Emacs: 23.3.1使用 apt 安装了 sbcl 与 slime,但是启动时会出现: "/usr/share/common-lisp/source/slime/swank-loader.lisp" there is no package with name "ASDF"解决这个问题可以通过安装 Quicklisp 来解决: 1...阅读全文摘要: 原文地址:http://www.mulle-kybernetik.com/weblog/2011/10/how_to_build_libobjc_for_os_x.htmlMax OS X 版本:10.6.8待编译运行时版本:437.3刚刚自己试了一下,可以编译。另:文章中提到头文件的包含路径为绝对路径,这样不好,可以改为相对路径,比如:以 $(SRCROOT) 为参考。附自己修改的工程打包:https://files.cnblogs.com/Proteas/objc-runtime_10.6.8_437.3.zip下载后应该可以直接编译,有问题可以留言。原文内容:This builds and阅读全文摘要: 一维码:barcode二维码:two-dimensional barcode在 iOS 下主要有两个开源库可以用来处理条码:1、Zxing:http://code.google.com/p/zxing2、ZBar:http://zbar.sourceforge.net/两个库都有相应的 demo 程序。其中,zxing 对 Android 支持更好。相应的缺点:1、With ZBar I had ...阅读全文摘要: 线程相关函数:1. pthread 相关函数的头文件: #include <pthread.h>2. pthread 的创建函数: intpthread_create (pthread_t *thread_id, const pthread_attr_t *attributes,void *(*thread_function)(void *), void *arguments);3. pthread 对应的结束函数: intpthread_exit (void *status);4. 一个线程可以等待另一个线程的结束: intpthread_join (pthread_t thre阅读全文摘要: C: 1. The C Programming Language (Second edition) - Brian W. Kernighan and Dennis M. Ritchie 2. C: A Reference Manual - Samuel P. Harbison and Guy R. Steele 3. C Pocket Reference (O'Reilly) - Peter Pr...阅读全文摘要: Ref: http://www.chromium.org/developers/how-tos/build-instructions-windowsRef:http://trac.webkit.org/wiki/Chromium环境搭建:1、安装 VS2010 SP1,下载地址:http://go.microsoft.com/fwlink/?LinkId=2107102、安装 Windows 7.1 SDK(x64),下载地址:http://download.microsoft.com/download/F/1/0/F10113F5-B750-4969-A255-274341AC6BCE/GR阅读全文摘要: 近期将xcode升级到了4.2,SDK是 iOS5。在 iOS 5 下,以前可以正常工作的 NSOperation,会崩溃。崩溃的原因是:取消队列中的操作,但是该操作还没有开始。解决这个问题的方法是: 在 start 方法中判断操作是否已经取消,如果取消,结束操作,没有取消,再执行操作。 在 cancel 方法中判断操作是否正在执行,如果在执行,结束操作,如果没有,修改操作的isCancelled状态。头文件:#import <Foundation/Foundation.h>@interface FMURLRequest : NSOperation { BOOL _i...阅读全文posted @ 2012-02-01 17:16 Proteas 阅读(232) | 评论 (0) 编辑03 2012 档案
摘要: 最近遇到一个问题:在一次程序运行期间,无法取消新浪微博的绑定。原因:新浪微博OAuth绑定时使用了 SSO,并且会在此次程序运行期间保留 Cookie,造成无法取消绑定。处理方法:删除 Cookie。阅读全文摘要: ref:Common Lisp Style Guide - Ariel Networks LabsPackageOne package per one fileStrangely enough, in case of legacy CL programs, their packages are declared in one file (maybe named "package.lisp"). In other hand, we recommend to declare each packages in each files.You should always put li阅读全文posted @ 2012-03-04 00:14 Proteas 阅读(22) | 评论 (0) 编辑04 2012 档案
摘要: You can do this in one of two ways. The first way is to use theMPMoviePlayerControllerto grab the thumbnail:MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] in...阅读全文摘要: 安装 Mac OS X 时不要使用大小写敏感的日志文件系统,因为这样子很多历史比较久的软件都用不了,比如:Adobe 系列的软件。原因是:早期的 Mac 文件系统并不是大小写敏感的。今天被这个问题折腾惨了。如果已经错了,可以使用 iPartition 处理这个问题。阅读全文摘要: 找到应用程序的描述链接,比如:http://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8然后将 http:// 替换为itms:// 或者itms-apps://:itms://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8itms-apps:// itunes...阅读全文posted @ 2012-04-14 17:46 Proteas 阅读(861) | 评论 (0) 编辑05 2012 档案
摘要: 目标:通过代码,编译,打包生成 IPA 后,然后通过修改 IPA,再签名,打包生成更多的 IPA。前提:iOS 应用程序是可配置的,不管是通过配置文件,还是暴露出来的 SDK(比如:以Lua 方式向外暴露)。相关工具与资料: https://code.google.com/p/iresign/ http://www.ketzler.de/2011/01/resign-an-iphone-app-i...阅读全文摘要: iOS 中应用的变化主要集中在三个方面:界面,业务逻辑,数据源。下面是自己做的一个技术实验,可以用来处理业务逻辑的变化。大概说一下,具体见代码。使用Lua作为类的粘合剂,主要应用在什么场景呢?比如:点击一个按钮后,程序跳转到什么类或者控制器。思路:向 Lua 提供完备的信息,通过在 Lua 中的配置,实现业务逻辑的整合。推理下去,用 ObjC 代码写模块,模块间的粘合用 Lua。代码地址:http...阅读全文posted @ 2012-05-15 12:48 Proteas 阅读(68) | 评论 (0) 编辑06 2012 档案
摘要: 1、Belady's algorithms2、random replacement3、first in first out4、least frequent used (LFU)5、simple time-based6、least recently used (LRU)7、adaptive replacement cache (ACR)先记录下来,随后展开了解下。阅读全文摘要: 应当使用:@property (nonatomic, copy)今天在这个问题上犯错误了,找了好久才知道原因。另外,简单的进行反汇编看了下,Block 被存储在静态变量区,运行时构造出一个运行栈,进行调用。retain 并不会改变 Block 的引用计数,因此对 Block 应用 retain 相当于 assign。但是既然在静态存储区,为什么会出现 EXC_BAD_ACCESS 呢?代码都在的呀...阅读全文摘要: http://isgl3d.com/downloadhttp://maniacdev.com/2009/08/the-open-source-iphone-game-engine-comparison/http://maniacdev.com/2011/01/open-source-and-commercial-ios-game-engine-listings-updated/http://man...阅读全文摘要: 目前在做 iOS 应用开发,并在应用中使用了 Lua 脚本引擎。但是有的同事不理解为什么要引入脚本。在应用中引入脚本主要有下面两个原因:1、脚本的表达能力比原生语言强: 这个道理比较简单,比如:一个冒泡排序,用C来实现比用汇编实现,代码行数要少。 这样,用脚本就可以更简练得处理程序中易变部分。2、脚本语言本身的扩展能力强: 这个能力可以以 Common Lisp 来说明,语言本身向外暴...阅读全文摘要: 第一步:生成 .app 时,只是对代码进行签名,资源会做拷贝输出。这时可以自己写脚本将相关资源拷贝到 .app 的目录,因为利用 xcode 的资源输出,有目录的限制。第二步:将 .app 生成 .ipa 时,会对资源进行签名。阅读全文摘要: 我们知道 NSOperationQueue 可以调度 NSOpertion 间的依赖,虽然可以为 NSOperation 增加 Depends,但是框架并没有提供方法,让你可以直接判断依赖关系是否成立。框架这么设计主要是考虑通用性,Operation 执行的成功与否是业务相关的。但是在实际应用中,只有 Opration 依赖的所有操作都执行成功了,当前的 Operation 执行才有意义。====...阅读全文摘要: The Objective-C Runtime is one of the overlooked features of Objective-C initially when people are generally introduced to Cocoa/Objective-C. The reason for this is that while Objective-C (the languag...阅读全文摘要: Inside the Objective-C Runtimeby Ezra Epstein 05/24/2002IntroductionOnce upon a time dynamism in languages (especially OO languages) was a point of debate. Essentially dynamism won: Java added "reflec...阅读全文posted @ 2012-06-06 10:10 Proteas 阅读(22) | 评论 (0) 编辑07 2012 档案
摘要: 1、为什么要在应用中引入脚本?2、为什么是 Lua ?3、使用 Lua 开发应用的几种模式4、Hello Lua5、Meta-*: Lua 与 Objective-C 集成的原理6、wax 框架及其本身的一些问题7、Demos8、其它9、目前没有解决的问题PDF:https://files.cnblogs.com/Proteas/iOS%E4%B8%ADLua%E8%84%9A%E6%9C%AC%E...阅读全文posted @ 2012-07-26 15:40 Proteas 阅读(30) | 评论 (0) 编辑08 2012 档案
摘要: Class A:@interface ClassA : NSObject{}@property(nonatomic, retain) Foo* foo;@endClass B:@interface ClassB : NSObject{Foo* foo;}@property(nonatomic, retain) Foo* foo;@end上面两个类的不同是:第二个类包含一个名字为"foo"的 ivar。如果在类的实现部分包含了"@synthesize foo;",并且用了比较新的编译器(好像是从 4.2 开始的),对于第一个类,编译器会自动为类添加一个合适阅读全文摘要: 如果读最新版的代码有问题,可以选一个早期的代码读读。另外,一开始不要淹没在细节中,可以从类图上鸟瞰下实现。类图的PDF文件:https://files.cnblogs.com/Proteas/lua-1-uml.pdf类图如下:阅读全文摘要: Unit Test 工具1、OCUnit:从 xcode 2.1 开始集成到开发环境中,使用方便,不需要引入额外的库。并可以配置 xcodebuild,实现在命令行测试,从而在 CI 中进行测试与报告。2、GTM 的单元测试部分:对 OCUnit 进行了扩展,增加了一些宏。地址:https://code.google.com/p/google-toolbox-for-mac/wiki/iPhone...阅读全文摘要: 在进行 iOS 时一般会遇到从网络上获取 JSON 格式数据的情况,现在有很多框架可以将 JSON 格式的字符串解析成 NSDictionary。但是解析成 NSDictionary 后就直接使用吗?每次读取值,都要知道类型;都要用 objectForKey?这样我们用起来也太麻烦了。这时我们一般会定义一些业务数据的本地对象封装,我们从这些业务对象中读取需要的值,就方便多了。但是,将 NSDictionary 转换为业务对象又太麻烦了,还是无法避免手工编写代码解析 NSDictionary。其实,想想这解析工作完全可以自动完成的。其实市面上已经有了完成这部分功能的代码,她在 RestKit 这阅读全文posted @ 2012-08-09 15:09 Proteas 阅读(736) | 评论 (0) 编辑09 2012 档案
摘要: The Objective-C language level synchronization uses the mutex, just likeNSLockdoes. Semantically there are some small technical differences, but it is basically correct to think of them as two seperat...阅读全文posted @ 2012-09-21 13:58 Proteas 阅读(57) | 评论 (1) 编辑10 2012 档案
摘要: IntroductionWeb browsers are probably the most widely used software. In this book I will explain how they work behind the scenes. We will see what happens when you type 'google.com' in the address bar...阅读全文摘要: IntroductionThe Xcode project file is an old-style plist (Next style) based on braces to delimit the hierarchy. The file begins with an explicit encoding information, usually the UTF-8 one. This means...阅读全文摘要: Let’s take a quick little tour of the Xcode project file format. Anyone doing Mac OS X or iOS development in a team environment (i.e. just about everybody) has had to deal with the joy of merging proj...阅读全文摘要: Before xcode 4.3 we can use this to encode and decode NSCachedURLResponse:@implementation NSCachedURLResponse (NSCoder)- (void)encodeWithCoder:(NSCoder *)coder{ // TODO:}- (id)initWithCoder:(NSCoder *...阅读全文摘要: xcode 首先会在它的“偏好设置PList”中查找对应的信息。如果没有找到,会使用“地址簿”中当前用户信息。如果两个都设置了,那 PList 中的优先级更好一些。在默认情况下,ORGANIZATIONNAME 并没有设置。1、读取 :defaults read com.apple.Xcode PBXCustomTemplateMacroDefinitions -dict ORGANIZATION...阅读全文摘要: 1、UIWebDocumentView2、WebView3、//================================================================//私有框架所在目录?/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/PrivateFrameworks//=========================================================阅读全文posted @ 2012-10-12 00:12 Proteas 阅读(34) | 评论 (0) 编辑11 2012 档案
摘要: IntroductionThere has been a change in the Cocoa community in the past few years, where the use of accessors ininit/deallocis frowned upon, recommend against, and outright considered to be wrong. It is much better, they say, to directly access instance variables instead. In other words, the recommen阅读全文摘要: This post is a look at how clang implements blocks and how this implementation leads to a number of strange behaviors including local variables that end up global, Objective-C objects allocated on the...阅读全文摘要: Part-1:EnvironmentSetupA few weeks ago I came into the need of optimizing some OpenGL code for iOS. There was alot of matrix- and vector-calculations going on that could greatly be improved by taking ...阅读全文摘要: When I wrote myIntroduction to NEON on iPhone, I considered some knowledge about the iOS devices’ processors as assumed to be known by the reader. However, from some discussions online I have realized...阅读全文摘要: class-dump-zhttp://code.google.com/p/networkpx/iphone-dataprotectionhttp://code.google.com/p/iphone-dataprotection/SpyPhonehttps://github.com/nst/SpyPhonedumpdecryptedhttps://github.com/stefanesser/du...阅读全文posted @ 2012-11-06 01:12 Proteas 阅读(17) | 评论 (0) 编辑12 2012 档案
摘要: Here's the disassembly for objc_msgSend on ARMv6, iOS4.2.1 (sorry no ARMv7 devices on my desk at the moment). I'll try to annotate it: 0x32d98f0c <objc_msgSend+0>: teq r0, #0 ; 0x0 0x32d98f10 <objc...阅读全文摘要: 我们知道在 Objective-C 中给 nil 发送消息程序不会崩溃,Objective-C 是以 C 语言为基础的,PC 上,在 C 语言中对空指针进行操作,程序会由于越界访问而出现保护错进而崩溃,但是 Objective-C 中为什么不会崩溃呢?原因需要从源代码中寻找,下面是 objc_msgSend 的 arm 版汇编代码片段:在 arm 的函数调用过程中,一般用 r0-r4 传递参数,用 r0 传递返回值。对应 objc_msgSend,第一个参数为 self,返回值也是 self,都放在 r0(a1)中。/**************************************阅读全文摘要: 0 0 1 185 1060 Tech-P 8 2 1243 14.0 Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{...阅读全文摘要: 我们看到有些应用会安装一些Provisioning文件,这时想分析下这些Provisioning文件的内容,比如:为应用带来了哪些好处。在越狱设备上,查找Provisioning文件还是比较方便的,位置:/var/MobileDevice/ProvisioningProfiles只有使用相应的工具将这些文件下载下来,然后分析就可以了。阅读全文摘要: 前几个月有个人问如果忘记kindle密码该怎么办, 那时比较忙,现在有空给Amazon发了个email. 的到了如下的办法。If you cannot remember the password for your Kindle, you can reset your password to regain access. Resetting your password will delete all...阅读全文摘要: 单纯使用 UIWebView 无法获得页面加载完成事件,主要有如下几个原因:1、iOS 中的 UIWebView 是一个阉割版,很多接口与事件都没有暴漏(使用私有 API 可以)。2、页面中有 iFrame 或者 ajax 请求。解决问题的办法是通过 Javascript 向 UIWebView 通知页面加载完成的事件:JS Fragment:HasLoadedPage();function HasLoadedPage() { if(document) { if(document.readyState === "loaded" || document.readyState 阅读全文

































浙公网安备 33010602011771号