标签:
Objective-C
1.让Xcode的控制台支持LLDB类型的打印
这有什么用?
怎么说尼,笔者认为这个还是比较有用滴,为什么有用尼?
因为在Xcode断点调试的时候, 在控制台输入 po self.view.frame 或者 po id 类型的时候就死翘翘了。
不信? 看如下图 :
进入正题
打开终端输入三条命令:
1. touch ~/.lldbinit
2. echo display @import UIKit >> ~/.lldbinit
3. echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit
输完命令后没有任何提示? 好吧, 那恭喜你成功了~! 然后, 最关键的一步来了, 那就是…
重新运行项目(不用重启Xcode也可以),看如下图~~
就代表成功啦
那么现在我们继续在控制台输入po self.view.frame
成功了!如果po指令是一个id类型也可以正常打印。是不是感觉方便很多呀? 反正我是这么觉得。至于有没有用就看个人需要咯~~!
如何删除?
好吧, 那么问题来了, 我用命令创建, 如果不想玩了怎么办尼??
其实很简答, 看第一条命令touch ~/.lldbinit,就是在根目录下创建了一个隐藏文件.lldbinit,然后删除这个文件就搞定啦。
打开终端然后,在终端输入 :?rm ~/.lldbinit 命令即可.
2.用宏定义检测block是否可用!
#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); }; // 宏定义之前的用法 /* if (completionBlock) { completionBlock(arg1, arg2); } */ // 宏定义之后的用法 BLOCK_EXEC(completionBlock, arg1, arg2);
3.用@() 来包含C字符串 或者非OC对象
NSString *propertyAttributesString = @(property_getAttributes(class_getProperty([NSObject class], "description")));
4.使用ARC和不使用ARC(from 夏夏)
//使用ARC和不使用ARC #if __has_feature(objc_arc) //compiling with ARC #else // compiling without ARC #endif
5.iOS图片内存优化(博文)内存优化经验(from 灰灰)
解决步骤:instrument调试后,发现没被释放的全是imageIO,差不多就知道了,把读图的方式,从[UIImage imageNamed:@”“],改成imageWithContentsOfFile,就可以了。
问题原因:imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。
Tip1:.xcassets里的图片无法用imageWithContentsOfFile读取;
Tip2:imageWithContentsOfFile读取图片需要加文件后缀名如png,jpg等;
6.在控制台里打印controller的层级
在控制台里使用po [UIViewController _printHierarchy]命令即可打印出controller的层级,一目了然.大家都去玩玩吧~~1
7.在控制台里打印view的层级
在控制台里使用po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令即可打印出view的层级,一目了然。
当然,可能对于某一些人来说打印window下的所有view层级,会觉得眼花缭乱。
但是,也可以打印指定某一个view的层级。
po [view recursiveDescription]
8.在debug模式下的控制台里使用po命令打印对象的属性和值
添加分类,加上代码即可。不用导入头文件,即可在控制台里使用po命令打印出model的属性和值,这个方法主要使用方法欺骗的手段,替换系统的description方法
9.用宏创建单例
#define SYNTHESIZE_SINGLETON_FOR_CLASS_ARC(className) \ + (className *)shared##className { static className *shared##className = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared##className = [[self alloc] init]; }); return shared##className; }
10.判断系统是否大于、小于、等于某个版本
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending) #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
11.弱引用与强引用宏
#define STRONGSELF() __strong typeof(weakSelf)strongSelf = weakSelf #define WEAKSELF() __weak __typeof(&*self)weakSelf = self
在自定义的block里面,弱引用之后还要再强引用一下,防止被释放
WEAKSELF(); _loanStylePicker.selcetBlock = ^(NSUInteger index ,NSUInteger seledRow) { STRONGSELF(); [strongSelf.tableView reloadData]; };
但是有一点需要注意的是,系统的block是不需要弱引用的,原因请参考https://www.zhihu.com/question/36358590
12.隐藏导航栏下面的那条分隔线的方法
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new];
+ (UIImage *) imageWithColor: (UIColor *) color { CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return theImage; }
13.监听网络状态
[[AFNetworkReachabilityManager sharedManager] startMonitoring]; // 检测网络连接的单例,网络变化时的回调方法 [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { DDLogInfo(@"%ld", (long)status); NSString *netName; switch (status) { case AFNetworkReachabilityStatusUnknown: netName = @"未知"; break; case AFNetworkReachabilityStatusNotReachable: netName = @"无网络"; break; case AFNetworkReachabilityStatusReachableViaWWAN: netName = @"3G"; break; case AFNetworkReachabilityStatusReachableViaWiFi: netName = @"wifi"; break; default: break; } }];
14.如何在xib中快速设置borderWidth、borderColor、cornerRadius、maskToBounds
.h文件
#import <UIKit/UIKit.h> @interface UIView (layerAdditions) @property (nonatomic, assign) IBInspectable CGFloat bx_borderWidth; @property (nonatomic, strong) IBInspectable UIColor *bx_borderColor; @property (nonatomic, assign) IBInspectable CGFloat bx_cornerRadius; @property (nonatomic, assign) IBInspectable BOOL bx_maskToBounds; @end
.m文件
#import <objc/runtime.h> @implementation UIView (layerAdditions) - (void)setBx_borderColor:(UIColor *)bx_borderColor { objc_setAssociatedObject(self, @selector(bx_borderColor), bx_borderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.borderColor = bx_borderColor.CGColor; } - (UIColor *)bx_borderColor { return objc_getAssociatedObject(self, _cmd); } - (void)setBx_borderWidth:(CGFloat)bx_borderWidth { objc_setAssociatedObject(self, @selector(bx_borderWidth), @(bx_borderWidth), OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.borderWidth = bx_borderWidth; } - (CGFloat)bx_borderWidth { return [objc_getAssociatedObject(self, _cmd) floatValue]; } - (void)setBx_cornerRadius:(CGFloat)bx_cornerRadius { objc_setAssociatedObject(self, @selector(bx_cornerRadius), @(bx_cornerRadius), OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.cornerRadius = bx_cornerRadius; } - (CGFloat)bx_cornerRadius { return [objc_getAssociatedObject(self, _cmd) floatValue]; } - (void)setBx_maskToBounds:(BOOL)bx_maskToBounds { objc_setAssociatedObject(self, @selector(bx_maskToBounds), @(bx_maskToBounds), OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.masksToBounds = bx_maskToBounds; } - (BOOL)bx_maskToBounds { return [objc_getAssociatedObject(self, _cmd) boolValue]; } @end
标签:
原文地址:http://www.cnblogs.com/xiaobaizhu/p/5714357.html