1. Xcode插件目录
~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins
2. iOS静态库打包
1. 新建工程 --- Framework & Library
2. 写完Framework项目后,直接编译,会生成 .h文件和.a实现文件(看不见源码的二进制文件)
> 但是编译成 .a文件时, 要针对不同的平台编译 , 继而生成不同平台上可以使用的 .a 文件
1)iOS Device,编译出来的.a静态库文件是基于arm架构上的,即可在 - 真机(arm) - 上运行。
2)iPhone Simulator,编译出来的静态库文件是基于i386架构的,可在 - 模拟器(i386) - 中运行
3. 将不同平台下适用的.a文件, 统一打包成一个适用所有平台的.a文件
> lipo -create i386平台的.a文件全路径 arm平台的.a文件 -output 通用.a文件的路径
3. #define 使用
1. 改进NSLog()函数 -- 1)发布app时清除所有log语句 2)让log的信息更加详细
#ifdef DEBUG
#define log(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]);
#else
#define log(...);
#endif
2. 代替一些常用的 对象、方法
1) 对象 (如: Appdelegate对象)
#define APP_DELEGATE (Appdelegate *) [[UIApplication application] delegate];
2) 方法
#define Func(args1, args2) {return (args1+args2);}
4. BaseViewController -- 所以控制器的父类,来提供一些基础性的代码
1. 获取rootView的frame,(x,y), width, height, 最左边x, 最上边y
2. 定义一个pushVC方法 , 来拦截所有该子类控制器的pushViewController方法
- (void)pushVCfrom:(id)fromVC to:(id)toVC isAnimate:(BOOL)animate ;
5. 动态加载第三方字体
1.网上搜索字体文件(后缀名为.ttf,或.odf)
2.把字体库导入到工程的resouce中
3.并且在项目的XX-Info.plist中加上Fonts provided by application这个属性,这个作为Array,在其item中加入.ttf字体的名字+后缀
4.获取系统所有的字体
NSArray* fontArrays = [[NSArrayalloc] initWithArray:[UIFontfamilyNames]];
5. 创建自己的字体
UIFont* fontOne = [UIFontfontWithName:@"外置放入的字体名"size:15];
NSArray *familyNames = [UIFont familyNames];
for( NSString *familyName in familyNames ){
//1. 找到
}
6. Block中得引发 retain cycle 错误
1. Block是什么?
> 一个NSObject对象
> 存在创建,释放等声明周期、
> 也可以被一个该Block类型的变量所持有
> 所以,Block就跟一般的对象,没有什么区别,所以也会产生内存不释放的问题
2. 非ARC下 , 产生该错误解决方案.
eg.1 - 非ARC下
//下面这段代码会造成
1. manager.complete变量持有Block对象
2. Block对象又持有Manager对象
> 相互持有, 形成2个都不能释放
DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
//...complete actions
[manager otherAction];
[manager release];
};
> 解决: 使Manager对象/Block对象 任一方,取消对另一方的持有
DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
//1. block执行代码
[manager otherAction];
//2. 业务逻辑执行完后, 让Manager对象, 取消对当前Block对象的引用(持有/指向)
manager.complete = nil;
//3. 让Manager对象释放 --> Block对象跟着也会被释放
[manager release];
};
3. ARC下, 产生该错误解决方案。
Manager * manager = [[DoSomethingManager alloc] init];
//复制一个weak指针指向Manager对象
weak Manager * weak_manager = manager;
manager.complete = ^{
//Block内部,使用Manager对象的weak指针变量
[weak_manager otherAction];
}