当前位置: 首页 > 编程日记 > 正文

『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

亲爱的读者们,你们好 !年底将近,分享从过去一年你最喜欢的技巧和建议作为礼物送给新手们。提交你的最喜欢的迅速或objc琐事,实用的提示,意外的发现,实用的解决方法,没用的迷恋,或不论什么其它你认为今年非常酷。

就在以下写下你的评论!


笔者分享总结例如以下(本篇会不定期进行更新) :

objective-c


用宏定义检測block是否可用~!



#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };    // 宏定义之前的使用方法  
/* 
if (completionBlock)   
{   completionBlock(arg1, arg2);   
}   */  // 宏定义之后的使用方法  
BLOCK_EXEC(completionBlock, arg1, arg2); 

在控制台里支持LLDB类型的打印 :po framepo id类型 打印


open terminal (打开终端输入例如以下三条命令,然后重新启动Xcode里app就可以):

  1. touch ~/.lldbinit
  2. echo display @import UIKit >> ~/.lldbinit
  3. echo target stop-hook add -o \”target stop-hook disable\” >> ~/.lldbinit

博文地址,具体教程点此

@() 来包括C字符串 或者OC对象



NSString *propertyAttributesString =@(property_getAttributes(class_getProperty([NSObject class], "description")));
// T@"NSString",R,C

AmIBeingDebugged(from mattt)


Nolan O’Brien brings the AmIBeingDebugged function to our attention from from this Technical Q&A document:

#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>static Bool AmIBeingDebugged(void) {int mib[4];struct kinfo_proc info;size_t size = sizeof(info);info.kp_proc.p_flag = 0;mib[0] = CTL_KERN;mib[1] = KERN_PROC;mib[2] = KERN_PROC_PID;mib[3] = getpid();sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);return (info.kp_proc.p_flag & P_TRACED) != 0;
}

给SDK头文件加权限


假设您是从DMG安装Xcode的,看看这个技术通过Joar Wingfors,以避免通过保留全部权,权限和硬链接意外改动SDK头:

$ sudo ditto /Volumes/Xcode/Xcode.app /Applications/Xcode.app

检查void *实例变量(from mattt)


对于逆向project的目的,可是这是能够看的对象实例变量。它通常非常easy用valueForKey这样获取。

另一个情况下,它不能用valueForKey获取。尽管:当这个变量是void *类型。

@interface MPMoviePlayerController : NSObject <MPMediaPlayback>
{void *_internal;    // 4 = 0x4BOOL _readyForDisplay;  // 8 = 0x8
}

用底层方式来訪问

id internal = *((const id*)(void*)((uintptr_t)moviePlayerController + sizeof(Class)));

不要使用这段代码,它的非常危急的。仅使用于逆向project!

使用ARC和不使用ARC(from 夏夏)


//使用ARC和不使用ARC
#if __has_feature(objc_arc)
//compiling with ARC
#else
// compiling without ARC
#endif

读取本地图片(from 夏夏)


#define LOADIMAGE(file,ext) [UIImage imageWithContentsOfFile:[NSBundle mainBundle]pathForResource:file ofType:ext]//定义UIImage对象
#define IMAGE(A) [UIImage imageWithContentsOfFile:[NSBundle mainBundle] pathForResource:A ofType:nil]

一个通用回调的简单演示样例(from 灰灰)


.h文件

#import <UIKit/UIKit.h>@interface UIViewController (LHYBlock)#pragma mark - block@property (nonatomic, copy) void (^viewControllerActionBlock)(UIViewController *vc, NSUInteger type, NSDictionary *dict);#pragma mark - viewControllerAction/***  View 事件的block回调**  @param viewControllerActionBlock block的參数有view本身,状态码,键值对。*/
- (void)viewControllerAction:(void (^)(UIViewController *vc, NSUInteger type, NSDictionary *dict))viewControllerActionBlock;@end

.m 文件

#import "UIViewController+LHYBlock.h"
#import <objc/runtime.h>
@implementation UIViewController (LHYBlock)
#pragma mark - runtime associate- (void)setViewControllerActionBlock:(void (^)(UIViewController *vc, NSUInteger type, NSDictionary *dict))viewControllerActionBlock {objc_setAssociatedObject(self, @selector(viewControllerActionBlock), viewControllerActionBlock, OBJC_ASSOCIATION_COPY);
}- (void (^)(UIViewController *, NSUInteger, NSDictionary *))viewControllerActionBlock {return objc_getAssociatedObject(self, @selector(viewControllerActionBlock));
}#pragma mark - block- (void)viewControllerAction:(void (^)(UIViewController *vc, NSUInteger type, NSDictionary *dict))viewControllerActionBlock {self.viewControllerActionBlock = nil;self.viewControllerActionBlock = [viewControllerActionBlock copy];
}#pragma mark -
@end

import这个类 , 就能用block, 參数都是通用的本身,状态码。字典.(灰神提供)

iOS图片内存优化(博文)内存优化经验(from 灰灰)


解决步骤:instrument调试后,发现没被释放的全是imageIO,差点儿相同就知道了。把读图的方式,从[UIImage imageNamed:@”“],改成imageWithContentsOfFile。就能够了。

这里写图片描写叙述

问题原因:imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。
TIPs1:.xcassets里的图片无法用imageWithContentsOfFile读取;
TIPs2:imageWithContentsOfFile读取图片须要加文件后缀名如png。jpg等;
灰神内存优化链接地址点此

自己定义弱关联对象(weak associated objects)


不幸的是,关联对象不支持弱引用.

幸运的是, 非常easy实现

你仅仅须要一个简单的类包装与弱引用一个对象.

@interface WeakObjectContainter : NSObject
@property (nonatomic, readonly, weak) id object;
@end@implementation WeakObjectContainter
- (instancetype)initWithObject:(id)object {self = [super init];if (!self) {return nil;}_object = object;return self;
}
@end

设置与获取


// 设置弱引用关联
objc_setAssociatedObject(self, &MyKey, [[WeakObjectContainter alloc] initWithObject:object], OBJC_ASSOCIATION_RETAIN_NONATOMIC);//获取弱引用关联
id object = [objc_getAssociatedObject(self, &MyKey) object];

在控制台里打印controller的层级


在控制台里使用po [UIViewController _printHierarchy]命令就可以打印出controller的层级,一目了然.大家都去玩玩吧~~1

这里写图片描写叙述

在控制台里打印view的层级


在控制台里使用po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令就可以打印出view的层级,一目了然.大家都去玩玩吧~~1

当然,可能对于某一些人来说打印window下的全部view层级,会认为眼花缭乱.

可是,也能够打印指定某一个view的层级.

po [view recursiveDescription]

debug模式下的控制台里使用po命令打印对象的属性和值


加入分类,加上代码就可以.不用导入头文件,就可以在控制台里使用po命令打印出model的属性和值

#import "NSObject+ZXPDebugDescription.h"
#import <objc/runtime.h>@implementation NSObject (ZXPDebugDescription)+ (void)load {method_exchangeImplementations(class_getInstanceMethod([self class], @selector(debugDescription)), class_getInstanceMethod([self class], @selector(zxp_swizzleDebugDescription)));
}- (NSString *)zxp_swizzleDebugDescription {//一把情况下,假设不是entity或者model的子类就不须要打印属性, 比方系统的class.~. 这个依照个人需求而定if (![self isKindOfClass:[ZXPBaseEntity class]] || ![self isKindOfClass:[ZXPBaseModel class]]) {return [self zxp_swizzleDebugDescription];}// 以上代码是推断是否model或者entityNSMutableDictionary *dictionary = [NSMutableDictionary dictionary];uint count;objc_property_t *properties = class_copyPropertyList([self class], &count);for (int i = 0; i<count; i++) {objc_property_t property = properties[i];NSString *name = @(property_getName(property));id value = [self valueForKey:name]?

:@"nil"; [dictionary setObject:value forKey:name]; } free(properties); return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary]; } @end

给category加入属性的小技巧


这是运用到了对象关联, 假设不会的请看这篇文章: 时空传送门, 点我

.h 文件

#import <Foundation/Foundation.h>@interface NSObject (ZXPDebugDescription)@property (copy,nonatomic) NSString *zxp_testString;@end

.m 文件

#import "NSObject+ZXPDebugDescription.h"
#import <objc/runtime.h>@implementation NSObject (ZXPDebugDescription)- (void)setZxp_testString:(NSString *)zxp_testString {objc_setAssociatedObject(self, @selector(zxp_testString), zxp_testString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}- (NSString *)zxp_testString {return objc_getAssociatedObject(self, @selector(zxp_testString));
}
@end

autolayout框架介绍(ZXPAutoLayout)


iOS原生的自己主动布局(NSLayoutConstraint)非常繁琐, 影响开发进度和可读性也不利于维护, 正所谓工欲善其事必先利其器 , 有一个良好的自己主动布局框架, 则会让我们事半功倍. 而ZXPAutoLayout则是解决这一问题和诞生 . 採用新颖的链式语法, 扩展性,可读性,维护成本也较低.并致力打造最好用,最简洁,最方便,最轻巧的自己主动布局.

以下一个简单演示样例. ZXPAutoLayout具体教程点此 – github地址点此

//设置一个背景为半透明红色的view,上下左右四边都距离superview的距离为10UIView *bgView = [UIView new];[self.view addSubview:bgView];bgView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:.5];[bgView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {//上下左右四边都距离superview的距离为10layout.edgeInsets(UIEdgeInsetsMake(10, 10, 10, 10));//也能够例如以下这行代码来设置,但要同一时候设置top,left,bottom,right.推荐以上写法,比較简洁.//layout.topSpace(10).leftSpace(10).bottomSpace(10).rightSpace(10);}];

动态调用block(黑魔法)


//定义一个block
id (^testBlock)(NSString *string,NSArray *array) = ^id(NSString *string,NSArray *array) {NSLog(@"param:--%@--%@",string,array);return string;};// _Block_signature  是iOS的私有apiconst void *_Block_signature(void *);const void *signature = _Block_signature((__bridge void *)(testBlock));NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:signature];NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];[invocation setTarget:testBlock];NSString *string = @"string";[invocation setArgument:&string atIndex:1];NSArray *array = @[@"xx",@"oo"];[invocation setArgument:&array atIndex:2];[invocation invoke];id returnValue;[invocation getReturnValue:&returnValue];NSLog(@"returnValue : %@",returnValue);

利用断点查找button的action


在控制台里输入br s -r . -s yourProjectName命令, 然后在app里点击一下button, 在让断点往下运行就可以.

ps:yourProjectName是你的project名的名字哦. 经笔者在Xcode7下使用这条命令的时候, 响应非常慢. Xcode6和Xcode5不会有这个问题, 可能是Xcode7的一个小小问题, 也不排除是我环境配置的太复杂而造成的影响~!

这条命令的具体赘述地址附上:点我就对了

自己定义并强化NSLog, 能查找LOG所打印的函数和类


//打印log
#ifdef DEBUG
#define ZXPLog(format, ...) NSLog((@"[函数名:%s]" "[行号:%d]  " format), __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define ZXPLog(format, ...);
#endif

相关文章:

一口一个,超灵活的Python迷你项目

来源 | 法纳斯特责编 | 寇雪芹头图 | 下载于视觉中国在使用Python的过程中&#xff0c;我最喜欢的就是Python的各种第三方库&#xff0c;能够完成很多操作。下面就给大家介绍22个通过Python构建的项目&#xff0c;以此来学习Python编程。大家也可根据项目的目的及提示&#xff…

说说大型高并发高负载网站的系统架构【转】

我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载和并发的解决方案上有一些…

DataGrid 的 全选/取消全选 控制(CheckBox)

DataGrid控件: <Columns> <asp:TemplateColumn> <HeaderStyle Width"10px"></HeaderStyle> <HeaderTemplate> <INPUT id"CheckAll" name"CheckAll" type"checkbox"…

k8s入门系列之介绍篇

Kubernetes介绍1.背景介绍  云计算飞速发展    - IaaS    - PaaS    - SaaS  Docker技术突飞猛进    - 一次构建&#xff0c;到处运行    - 容器的快速轻量    - 完整的生态环境2.什么是kubernetes  Kubernetes(k8s)是Google开源的容器集群管理系…

元宵节就要到了,花灯要不要来一盏?3D的那种

又是一年元宵佳节&#xff01;我国各地庆祝元宵节的方式很有讲究&#xff0c;有的地方吃汤圆&#xff0c;一个个软糯香圆&#xff1b;有的地方办灯展&#xff0c;十分热闹。当然&#xff0c;疫情当下&#xff0c;为了大家的安全&#xff0c;不建议线下聚众集会。但是&#xff0…

Android Timer的使用

1&#xff1a;服务端使用PHP <?phpecho date(Y-m-d H:i:s); ?> 2&#xff1a;activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

屏蔽相应键盘按钮

<script language"Javascript"><!-- //屏蔽鼠标右键、CtrlN、ShiftF10、F11、F5刷新、退格键 //Author: meizz(梅花雨) 2002-6-18 function document.oncontextmenu(){event.returnValuefalse;}//屏蔽鼠标右键function window.onhelp(){return false} //…

MySQL查询缓存

2019独角兽企业重金招聘Python工程师标准>>> MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存&#xff0c;MySQL 会立刻返回结果&#xff0c;跳过了解析、优化和执行阶段。 查询缓存系统会跟踪查询涉及查询中的每个表&#xff0c;如果这些表发生变化&#…

事半功倍系列 javascript

清华大学出版的《事半功倍系列 javascript》,本人照着书敲出来的,有些翻译了一下.前几年看了一下,最近无事,重新翻了翻,很有帮助.本书应该有光盘的,但学校的书,光盘不知在哪.希望对你学 javascript有帮助 第一章javascript简介 1.在地址栏输入javascript语句 Javascript:Doc…

Golang 本地帮助文档

2019独角兽企业重金招聘Python工程师标准>>> godoc -http:8000 url: http://127.0.0.1:8000 转载于:https://my.oschina.net/koalaone/blog/169626

2021版Java知识体系详解!(赠视频)

本篇文章是我们整理的一份架构师的成长路线&#xff0c;包括了并发编程、设计模式、常用框架、中间件、微服务与分布式、常用工具、JVM、MySQL、数据结构与算法&#xff0c;还有架构师精选视频、架构师成长路线高清大图。又是新的一年&#xff0c;每一年都会有人在成为架构师的…

【6】font-size 字体属性

font-style -- 字体风格font-variant -- 小型大写字母文本font-weight -- 文本的粗细font-size/line-height -- 大小/行高font-family -- 字体常用格式&#xff1a; fo…

MIS开发中.net Framework的打印功能

Microsoft .net Framework的打印功能都以组件的方式提供&#xff0c;为程序员提供了很大的方便&#xff0c;但是这几个组件的使用还是很复杂的&#xff0c;有必要解释一下。 打印操作通常包括以下四个功能 1 打印设置 设置打印机的一些参数比如更改打印机驱动程序等 2 页面设置…

UML部署图(转载)

概述: 部署图用于可视化的软件组件部署的系统中的物理组件的拓扑结构。 因此&#xff0c;部署图是用来描述一个系统的静态部署视图。部署图由节点和它们之间的关系。 目的: 部署名称本身描述的原理图的目的。部署图用于描述软件组件部署的硬件组件。组件图和部署图是密切相关的…

一年新增457万例,用 Python 揭示癌症的可怕之处

来源 | 数据分析与篮球作者 | 俊欣头图 | 下载于视觉中国2月27日下午5时许&#xff0c;香港著名演员吴孟达去世&#xff0c;引发了众多影星以及网友在社交媒体上面的悼念&#xff0c;根据其好友田启文的透露&#xff0c;吴孟达是去年年底发现自己患上肝癌的&#xff0c;当时癌细…

深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子

深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子 作者&#xff1a;寒小阳 时间&#xff1a;2016年1月。 出处&#xff1a;http://blog.csdn.net/han_xiaoyang/article/details/50521072 声明&#xff1a;版权所有&#xff0c;转载请联系作者并注明出处 1.引言 前面…

虚拟主机上用Asp.net实现Urlrewrite

在网上看到&#xff0c;很多朋友在asp.net中做urlrewrite&#xff0c;用的是HttpHandle&#xff0b;Server.Transfer的方法。其实这种方法是错误的。第一&#xff0c;HttpHandle是实现不了urlrewrite的&#xff1b;第二Server.Transfer是标准的重定向&#xff0c;根本不是urlre…

String spilt时转义特殊字符【转】

在使用String.split方法分隔字符串时&#xff0c;分隔符如果用到一些特殊字符&#xff0c;可能会得不到我们预期的结果。 我们经常使用public String[] split(String regex)方法来拆分一个有分隔符的字符串&#xff0c;但是由于参数regex是一个 regular-expression的匹配模式而…

融合AI与大数据技术,腾讯教育发布智能作业灯

3月2日&#xff0c;腾讯教育新品发布会在深圳举行&#xff0c;发布会上&#xff0c;腾讯教育联合暗物智能正式对外发布了AILA智能作业灯&#xff0c;并与华东师范大学出版社、宏途教育、众诚智学教育、江西软云科技等教育行业合作伙伴签订战略合作协议&#xff0c;共同打造智慧…

【踩坑记录】记一次MySQL主从复制延迟的坑

最近开发中遇到的一个MySQL主从延迟的坑&#xff0c;记录并总结&#xff0c;避免再次犯同样的错误。 情景 一个活动信息需要审批&#xff0c;审批之后才能生效。因为之后活动要编辑&#xff0c;编辑后也可能触发审批&#xff0c;审批中展示的是编辑前的活动内容&#xff0c;考虑…

ASP.NET 应用中大文件上传研究

在项目中经常要用到了大文件上传&#xff0c;要上传的文件有100多m&#xff0c;于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule&#xff0c;两个控件的方法是&#xff1a;利用隐含的HttpWorkerRequest&#xff0c;…

哪家互联网公司涨薪最厉害?居然不是阿里腾讯

最近脉脉职言区有一条讨论火了&#xff1a;哪家互联网公司涨薪最厉害&#xff1f;按照拼多多员工的说法&#xff0c;应届毕业生可以拿比腾讯阿里高30%的薪资&#xff0c;而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

如何修改 远程桌面的 默认端口号 3389

修改注册表的以下位置的键值&#xff1a; [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]"PortNumber"dword:00000d3d

Yolov11-detect训练自己的数据集

至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

联通和阿里云合作 建互联网云化卡号管理系统

1月17日晚间消息&#xff0c;继去年11月中国联通与阿里巴巴签订战略合作框架协议之后&#xff0c;今天下午阿里云宣布将于中国联通建卡号管理系统“cBSS2.0集中号卡系统”。据了解&#xff0c;这将是电信行业第一个核心业务系统云化改造的重点工程&#xff0c;也是云计算技术在…

如何最大限度提高.NET的性能

优化 .NET的性能 1&#xff09;避免使用ArrayList。 因为任何对象添加到ArrayList都要封箱为System.Object类型&#xff0c;从ArrayList取出数据时&#xff0c;要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0提供了一个新的类型&#xff0c;叫泛型…

别找了,Thonny 才是 Python 小白的最理想的 IDE

来源 | Python编程时光作者 | 写代码的明哥头图 | 下载于视觉中国当你在搜索引擎&#xff08;如百度&#xff09;或者各种问答社区&#xff08;如知乎&#xff09;搜索『学习Python 最好的 IDE/编辑器是哪个&#xff1f;』的时候&#xff0c;我想答案肯定是&#xff1a;PyCharm…

图书抄袭何时休,技术人的版权在哪里?

今天&#xff0c;一个很偶然的机会&#xff0c;看到了一本北京邮电大学出版社出版的技术图书《Linux服务器架设、性能调优、集群管理教程——实训与项目案例》&#xff0c;感觉有种似曾相识的感觉&#xff0c;于是打开目录大概了解了下&#xff0c;一个我不想看到的现象发生了&…

让MySql支持表情符号(MySQL中4字节utf8字符保存方法)

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节&#xff0c;而MySQL的utf8编码最多3个字节&#xff0c;所以数据插不进去。解决方案&#xff1a;将编码从utf8转换成utf8mb4。 1. 修改my.ini [mysqld] character-set-serverutf8mb4 2. 在Connector/J的连接参数中&a…

短信编码类无错版PDUdecoding.cs

////程 序 员&#xff1a;武志文(蚕蛹)/// sillnet163.net///文 件&#xff1a;PDUdecoding.cs///概 要&#xff1a;针对国内短信编码&#xff08;USC2&#xff09;///组成结构&#xff1a;包含四个函数&#xff1a;/// smsDecodedCenterNumber(string…