内存管理
凡是函数名中带有create、copy、new、retain等字眼的,都应该在不需要这个数据的时候进行release。
GCD的数据类型在ARC环境下不需要进行release;而CF的数据类型在ARC、MRC环境下都需要做release的
/* 内存管理的补充:
1、foundation框架 OC语言
2、core foundation 框架
1)、C语言,例如通讯录就是基于这个框架。
2)、core foundation 框架 在ARC、非ARC编译环境下都要管理内存对象。即core foundation 框架中手动创建的数据类型,都需要手动释放
foundation 和 core foundation 的数据类型可以相互转换
*/
NSString *str = @"123";
CFStringRef str2 = CFBridgingRetain(str);//Casts an Objective-C pointer to a Core Foundation pointer and also transfers ownership to the caller.
CFStringRef str3 = (__bridge CFStringRef)(str);//桥接,跨框架的数据类型转换
NSString *str4 = CFBridgingRelease(str3);//Moves a non-Objective-C pointer to Objective-C and also transfers ownership to ARC.
NSString *str5 = (__bridge NSString *)(str3);//不改变拥有者
NSLog(@"%@,%@,%@,%@,%@",str,str2,str3,str4,str5);
//释放core foundation数据类型
// CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
// CFRelease(array);
ps: 桥接
遇到的问题
一、加载图片的问题
1、App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.
https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-DontLinkElementID_13
在info.plist中添加
解决在iOS9 beta1中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/>
</dict>
二、加载XIB问题
1、xib文件上的对象顺序问题
ps: xib 最好只放一个对象
代码
- (IBAction)tapToolBar:(UITapGestureRecognizer *)sender {
NSLog(@"%s",__func__);
}
+ (instancetype)toolBar{
return [[[NSBundle mainBundle]loadNibNamed:@"HLtoolBar" owner:nil options:nil]firstObject];
}
1.问题分析:
[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x7a20fa60
1)superview 方法属于UIView
2)HLtoolBar *toolBar =[HLtoolBar toolBar];
->3) [self.view addSubview:toolBar];
po toolBar 即可看出问题所在。
po toolBar
<UITapGestureRecognizer: 0x79695ef0; state = Possible; view = <HLtoolBar 0x796962b0>; target= <(action=tapToolBar:, target=<HLtoolBar 0x796962b0>)>>
结论:错误是:将UITapGestureRecognizer 当作UIView使用
回到加载xib类方法进行分析:
return [[[NSBundle mainBundle]loadNibNamed:@"HLtoolBar" owner:nil options:nil]lastObject];
使用 po 即可看出: lastObject 是UITapGestureRecognizer
firstObject 才是HLtoolBar
po [[NSBundle mainBundle]loadNibNamed:@"HLtoolBar" owner:nil options:nil]
<__NSArrayM 0x7bfd4a20>(
<HLtoolBar: 0x7bfd5570; frame = (0 0; 200 100); autoresize = W+H; gestureRecognizers = <NSArray: 0x7bfd9810>; layer = <CALayer: 0x7bfd4a70>>,
<UITapGestureRecognizer: 0x7bfd51b0; state = Possible; view = <HLtoolBar 0x7bfd5570>; target= <(action=tapToolBar:, target=<HLtoolBar 0x7bfd5570>)>>
)
2、VC的View的使用xib定义 的时候,注意事项
File‘s owner 修改为对应的VC,并设置VC的View的连线
p s: 注意View的xib的文件名称,是否与其它的VC名称一样
[[HLViewController alloc]init];执行过程分析:
(1):去掉Controlle之后,同名的xib--HLView.xib
2)找完全同名的xib--HLViewController.xib
知识补充
宏的定义语法
参数拼接:
参数:classname
#define HSSingletonH(classname) +(instancetype)share##classname
//定义weakself,方便在block中使用self
参数:weakSelf
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;