iOS开发技巧

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];  
}















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值