iOS开发遇到的那些坑

1,421 阅读29分钟

containsString 如果用这个语法一定要切记取到的右边值不是空的

self.scrollView.mj_insetT += self.insetTDelta; 是调用set还是get // 只能输入英文或是数字 telField.keyboardType = UIKeyboardTypePhonePad;

用#define定义 在编译时不会对参数进行校正,不会保存,只会检查定义内部的#define是否有定以 导航栏占据了64,但是控制器的起始位置是从0开始,解决有两种navigationController.navigationBar.translucent = NO 控制器还有一种就是self.bounse来设置起始位置会根据导航栏下面下开始

kvo 一定要小心,不要对观察的key设置,容易死循环,如果要设置的话,那么就加一个bool,过滤掉观察的调用

注意不要改上面的目录,不然就会搜索不到

我觉得SVProgressHUD 可以加一个等级 等级去结束 低等级不能结束高等级的

封装的AFNetwork 带svprogress可以封装一个是否需要弹起提醒的框

cocoaPod: Unable to satisfy the following requirements: 解决办法就是 pod update 等半个小时

ARC的状态下不需要在dealloc的方法里调用 [super dealloc]

//要区分两种cell的类型,不然显示不了
//  没有用xib的
[self.tableView registerClass:[HMWCallMsgFlowCell class] forCellReuseIdentifier:kCallMsgFlowCellID];
//   有用xib的
[self.tableView registerNib:[UINib nibWithNibName:@"HMWCallMsgFlowCell" bundle:nil] forCellReuseIdentifier:kCallMsgFlowCellID];

pop动画跟CA动画区别在于,如果主线程卡主的情况下pop会被卡主,而CA动画不会

在对于两个textField的text进行比较判断,不能用 xxx.text == xxx2.text 虽然在5s以上的机子不会出现问题,但是在5或则5以下的机子就会出现判断不相等的问题。

用GCD的延迟在时间大于6秒的情况下 会有大概0.3秒的误差下时间会不准确 CGD:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.12 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{});  
NSTimer:  [NSTimer scheduledTimerWithTimeInterval:0.12f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

数组不能加空的对象,不然会崩

全局的Block只能定义一个代码块,重新定义就将会替代之前的block

用xib拉控件或者是自定义的视图,在代码里不需要初始化。。

模拟器或真机上,界面上上下有黑边,解决办法是 在工程general里设置LaunchScreen为启动页,然后对LaunchScreen.xib的大小设置好就可以了,第二种就是设置LaunchImage图片,选取正确的大小图片就行。

如果view.alpha = 0 的话,就相当于隐藏,没有点击事件

UIButton 要设置圆角就无法设置它的阴影 因为 masksToBounds 解决方法 添加到其他view上

如果用全局定义的动画 放到动画组里面, 对全局定义修改整个动画都会改变

  • 开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告。
  • 测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。
  • 生产环境:是值正式提供对外服务的,一般会关掉错误报告,打开错误日志。

三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。

字典是无序的,如果后台传来一个有序的字典,那么取[dic allKeys] 或[dic allValues]是无序的,但是key和value的顺序是相对应的有序,包括设死的字典打印出来都是无序的。

父类的代理如果在子类有实现的方法,那么还是会走子类的代理了方法而不走父类的 可以用super来调,但是要在父类的.h里面去声明这个(代理)方法,

关于pod会报错 友盟的sdk冲突问题 www.jianshu.com/p/a04a6e055…

发通知要注意是否在在主线程,是否对界面UI有操作,注意线程问题

代理使用assign会发生也指针可能会报异常,用weak不会,使用完就置为nil,推荐weak,

app Store 只要不是新的包或叫新的版本迭代,就可以自己随意上架下架

安卓腾讯应用宝审核一个小时就ok

苹果app会出现版本号没有同步的情况是因为,苹果上架包会先上,但是自动更新版本号更新不上去版本为原来的版本,强更可能会有问题

如果app需要强更的话,有的用户会在界面上停留,如果没有重新打开app就不会提醒更新的问题。

如果有创建多个推送的话,在极光或友盟上传p12文件设置一个推送证书,每个证书的序列号和公钥不一样

Xcode 控制台打印出来的字符流是Unicode的

WKWebView浏览器请求中如果请求体或地址有"+"的会被浏览器转译成空格符,解决办法是把"+"替换成%2B就可以了

如果不想让对象被执行后就被销毁,那么就用 __block 来修饰,等用完以后再置为空

如果外面有@weakify(self); 和 @strongify(self); 的话,在block里面嵌套的block就不需要加

一次性代码不一定是一次性的,在static dispatch_once_t onceToken; 如果onceToken = 0;当它置为空那么就会重新走一次性代码块。

微信第三方登录如果3个月没有使用那么就要重置它的密钥,不然回调会失败。

微信在友盟设置它的appkey时要注意是否是支付的appkey不然支付完不会走回调。

iOS5中加入的Storyboards(分镜)正在快速取代XIB。然而XIB在一些场景中仍然很有用。比如你的app需要适应iOS5之前的设备,或者你有一个自定义的可重用的view,你就不可避免地要用到他们。

如果你不得不XIB的话,使他们尽量简单。尝试为每个Controller配置一个单独的XIB,尽可能把一个View Controller的view层次结构分散到单独的XIB中去。

需要注意的是,当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard仅在需要时实例化一个view controller.

当家在XIB是,所有图片都被chache,如果你在做OS X开发的话,声音文件也是。Apple在相关文档中的记述是: 当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。取决于你所在的平台,使用NSImage 或UIImage的imageNamed:方法来获取图片资源. 这个问题我深有体会,用xib写的界面加载速度比直接用代码写的要慢好多。

x ?: y ?与:之间没有任何操作数,这是什么用法呢? 在通过几个实例的实验后,猜测?与:之间省略了x 也就是说x ? : y 就是 x ? x : y

就如果在模型里面的模型的字段要赋值,要先判断第二层的模型是否是空,不然赋值不了

#define 不能重新赋值,因为它是编译时处理的,运行就相当于常量

用svn管理,在同个文件下创建类会报错

键值观察在页面销毁的时候,要把对象的观察键值销毁,如果是弄错对象的话运行会蹦,键值也不要弄错

高版本的Excel的东西拷贝到低版本的Excel会有问题

用webView 加载空的富文本会崩掉

苹果公司在圣诞休假期间,App Store 应用审核将暂停五天。

ld: 215 duplicate symbols for architecture x86_64 clang: error: linker command fa Showing Recent Messages clang: error: linker command failed with exit code 1 (use -v to see invocation) iled with exit code 1 (use -v to see invocation)

有关于这种而找不到错误在哪错误原因可能是 有些值没有UIKIT_EXTERN

UIKIT_EXTERN NSString *const kAppversion;

在cell里面添加view 一定在addSubview之前先附上颜色,不然显示不出来

tableView.tableHeaderView的高度是没有办法设置的,所以必须设置自定义View的高度 来达到设置 self.tableView.tableHeaderView的高度 , 而且高度变化也要重新设,而且高度设为0是没有用的,要设置成0.01

  • (void)drawRect:(CGRect)rect{ 只能还在当前的view上UIView初始化时没有设置rect大小,直接导致drawRect不被自动调用。视图第一次显示的时候会调用。这个是由系统自动调用的,主要是在UIViewController中loadView和viewDidLoad方法调用之后;如果子类直接继承自UIView,则在drawRect 方法中不需要调用super方法。drawRect:方法不能手动调用,需要调用实例方法setNeedsDisplay或者setNeedsDisplayInRect,让系统自动调用该方法。

在拼接字符串要注意,%@ 如果参数为nil,拼出来的就是 (null),要解决这个问题,判断,如果为空参数设置为@""。

用xib 在重新设置height或其他边框时,要注意,height属性是获取不到最新设置的值,要等到它加载完了才能设置好。动画也是,解决方法是 用frame来做动画偏移量,不要单纯用height做动画的偏移量

如果是控制器的view,加在另一个控制器上,它会自动忽略导航栏的高度,

如果url 有带中文的或特殊字符的,都需要URLEncode转码,转成utf-8

使用MJRefresh 要注意 如果有继承的model的话,那么就也要在子类的.m里面加上 字典key

融云远程通知在app没有进入后台并没有sleep的时候弹出来的框是没办法获取到它的自定义模板。因为它走的是融云的代理

iPhone 9系统以下的在离开页面会销毁掉,如果没哟被强引用的话,调用空的数据就会蹦掉

blog.csdn.net/deft_mkjing…

1.有两个页面,A push到 B页面 正常情况下不会有问题,pop回来也正常
2.但是我在B上面加了个View,view里面是个searchBar
[self.navigationController.navigationBar addSubview:self.searBackView];
3.这里需要注意的是我用addSubView的方式加的(如果我加到系统的left or rightItem上去,pop回去的时候会自动回收)
这就埋下了隐患,我pop回去的时候在dealloc没有做任何处理
4.这就导致了B页面的顶部View还活着!!!(因为导航栏是共享的),但是B页面已经dealloc了
dealloc --> SortCategoryProductsViewController
5.当我A页面的searchBar动画下来的时候或者再次Push的时候,会去调用顶部View的拥有者也就是B页面,但是B
已经挂了,这个时候直接炸了

6.你以为结束了么,我擦,这在iOS 9 以上版本根本没事好么,9以下就炸了,血淋淋的教训啊,以后一定在低适配的
模拟器上多跑跑。这种版本花式炸最烦了
7.这个故事告诉我们,addsubView的方式加到导航栏上东西,最好在页面死的时候移除
dealloc能做的事情不多,也就是清理干净一些不必要的麻烦,一定要注意

在iOS 9.0系统以下的版本 调用UIAlertView 等弹框 进行跳转页面操作后,在新的页面点击任意地方都会蹦掉

观察对象不能多次销毁,不然就会蹦,而多次销毁通次却不会有问题

控制器没给大小的话,默认为屏幕的size, 而且在控制器到设置导航栏的起始位置的上64会覆盖别的view,层级要调整,不然其他的view被覆盖点击不了

如果要知道APP的名字有没有占用,可以通过iTunes connect 创建一个APP就知道,不用提交APP

生成推送文件,先打开推送,xcode编译一下自动生成

通常,Xcode会自动管理Entitlement文件,所以我们并不需要在Xcode Project的Buidling Settings -> Code Signing -> Code Signing Entitlements 特意设置文件。

LaunchImage 设置图片一定要按照标准的比例去设置,不然可能会显示不出来

关于手动导入微信报错,一个是有没有加 uikit框架,还有一个是info设置链接,还有是白名单过滤,还有的是 在"Other Linker Flags"中加入"-Objc -all_load"

fir 如果Wi-Fi差的情况下会下载失败,要改用数据流量下载。

设置header参数请求,不能直接拼接 HTTP hearder 参数

字段 类型 必需 描述 Authorization string 是 根据API_KEY和API_SECRET生成的签名认证参考

[manager.requestSerializer setValue:totalStr forHTTPHeaderField:@"Authorization”];

iOS性能调优之—tableView优化

www.jianshu.com/p/5182234b2… 自己的一些总结及思路,打扰了

如果开发者账号上有新添加的udid,那么就要清理本地的描述文件重新打包,新的添加的手机才能使用

6s机型 的9.1和9.2版本AppStore下载会崩溃,在测试链接上下载就行,可能是上传时压包的问题

保存照片和视频会蹦 导致问题的原因是iOS11系统过后苹果新增加了一个权限,以后保存图片需要添加权限“Privacy - Photo Library Additions Usage Description”。

UIButton 的titleLable的textAlignment是无法调整位置的,要通过下面的方式和 Btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight 或 titleEdgeInsets

http有关于 请求参数是加在请求头上的:要调用af的请求头方法添加 [manager.requestSerializer setValue:totalStr forHTTPHeaderField:@"Authorization"];

关于号码网证书问题,证书的有效期是1年,快到期了要换证书(.cer), (证书转换)后台会发一个crt证书,然后用钥匙串打开,然后导出.cer的证书就行了

码云创建的项目用svn上传文件时一定要注意,不能是空文件夹,不然就会上传失败,因为码云上面管理工具还是用了git的模式,不能有空文件夹形式的存在,而且svn会自动过滤掉.a文件,要在设置里面的通用去去除你想要的格式 码云上下载check out项目是有成员人数的限制,可以在gitlab上,那里是没有成员限制

注册AppID时,在官网上注册会注册不了,可以换在Itunes上面注册

下载的url 在AppStore搜索到软件,上面的三角获取

打开设置界面,只要有设置新的权限,跳回app界面好么重新启动要么就卡界面动不了

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication]canOpenURL:url] ) {
    [[UIApplication sharedApplication]openURL:url options:@{}completionHandler:^(BOOL        success) {
    }];
}

新建 App 提示 app名称已被使用。 要么改名 不然就得把名称申请为商标 然后申诉

个人开发者账号最多可以注册100个UDID,且只能disable,不能删除! 但是你续费后,苹果会给你一次删除的机会(只有一次)。

为什么添加新的UDID重新打包了 ,却没有添加进去? 解决方法:需要更新一下描述文件,描述文件是Xcode自动配置的还是手动配置的,

在进行float类型的运算,除法一定要有一个是小数点,或有带一个 F 的,不然得到的结果会是 0;

定时器滑动会暂停的问题:

方式1NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
方式2NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

区别在于当滚动屏幕时runloop会进入另外一种模式,定时器会暂停,为了解决这种问题,可以像方式2那样把定时器添加到NSRunLoopCommonModes模式下

在为Button 设置背景图片的时候, 会发现显示的效果和UI给的图片不一样, 往往是把图片显示成为蓝色, 这是因为在新版的iOS中, 会自动对图片渲染. 我们只要把图片渲染关掉就OK了

-(UIImage *)imageWithRenderingMode:(UIImageRenderingMode)renderingMode

iOS11中轮播图异常跳动 设置collView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

来自 www.jianshu.com/p/5f1d8a167…

更改 iOS app 的开发者账号 拥有了App的各项权利,收费,升级,限免等。 blog.csdn.net/buildsettin…

app上架没有限制个数,理论上是无限的

如果要切换屏幕(横屏和竖屏), 如果要禁止自动切换,详情见appdelegate的代码,其他的都不起作用, 但是有个问题是,当push到另一个控制器然后又切换屏幕的位置,那么新控制器的self.view.frame和kScreenWidth是没有变化,会维持之前的屏幕的方位,解决办法是在viewwillAppear里面设置UI,尽量不要使用self.frame

个人开发者账号和公司开发者账号区别

一个个人开发者账号只允许生成3个发布证书,两个开发证书。当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了,一般在我们的证书界面中应该只有一个开发证书,一个发布证书,没必要生成那么多的证书,证书一般在过期之后才会重新添加。 每一个证书都可以生成一个.p12文件,这个文件是一个加密的文件,只要知道其密码,就可以供给所有的mac设备使用,使设备不需要在苹果开发者网站重新申请开发和发布证书,就能使用。注意:一般.p12文件是给与别人使用的,本机必须已经有一个带秘钥的证书才可以生成.p12文件

混淆原理

因为硬编码的字符串是在可执行文件 Mach-O 全局的数据区,在符号表中很容易被搜索到,而字符串数组则不会。

4月22号 苹果进行维护,维护之后需要添加手机号码并且同意协议才能上架发布app,但是我的开发账号安全提示密码忘记了,无法登录Apple ID网站去设置,通过手机icloud设置也不行,听说用苹果9.3~10.0的手机可以开启双重认证就没事了(没试过),我后来用MAC的Icloud账号去弄双重认证就可以登录进Apple ID的网站,但是登录了网站设置了手机联系号码还是不行,后来是修改了地址才行,把地区改为美国或则香港的就能出现同意协议就解决了 www.jianshu.com/p/716faa3f3… Edit Phone Number 协议问题 这个骚操作,个人亲测可以解决问题

选择自动发布就不用设置证书,只需要下载证书下来,双击安装一下就行

苹果构建app需要时间大概是20分钟左右,开始审核到审核通过可能需要1.5~3个小时之间,晚上10点提交,早上8点40审核,苹果技术部客服4006701855 工作时间是9点到5点没有午休,早上9点准点打电话最容易接到电话,不然就要等40分钟以上,

如果忘记了账号的 安全认证问题,苹果客服那边是无法解决的,需要通过发邮件的形式给技术部去修改,而发邮件的内容必须按照邮件上说的格式发送,不然客服那边无法把邮件转发到技术部的人员,就算邮件格式里的要求不管我们的事,但是也要填写完整

iOS 注释方法大全 代码块加快捷键注释

www.code4app.com/blog-873057…

IOS-system 在github

硬件信息的获取:ip地址,网关,电池网络状况,运营商,内存信息等

后台的时间戳是13位,后三位是毫秒级别,前面十位相当于 60 * 60 * 24 * 365 * (2018.4 - 1970.1) 1524895474040 后系统转的

(NSTimeInterval) = 1524895534.6251822

解决double转string 精度的问题

double d2             = 8.3;
NSString *d2Str       = [NSString stringWithFormat:@"%lf", d2];
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:d2Str];
NSString *strD2       = [num1 stringValue];
NSLog(@"d2: %@", strD2);

如果runner 设置成release的话,断点调试的时候无法获得变量的值

iOS上架,如果在改版本上又提交新的包,就要在Bulid上叠加1

xcode9.2打出来的包,在ios8.1上出现本地图片模糊,Xcode9.2的bug,下载Xcode9.1或者升级

post是推送消息,addobserver添加监听。只有监听需要销毁

报错:dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserNotifications 原因是低版本手机里,Xocde的高版本FrameWork不支持

解决办法: target下的Build Phases标签里, 找到Link Binary With Libraries, 在里面找到UserNotifications.framework, 把status由Required 修改成Optional,然后再运行

gcd 的timer一定要设置成全局的对象,不然会被释放调用不了

要想真正的删掉SVN的文件要这样做(替换图片没事不用删) www.jianshu.com/p/9ff1fbca8…

在ARC的机制下查看引用次数 [xxx valueForKey:@"retainCount"];

在UIImageView上添加UIButton,按钮的点击会失效,解决方法是,在UIImageView对象上设置userInteractionEnabled = YES / NO 要看button是在上面还是在下面,在下面UIImageVIew选择 NO 如果button 在上面选择 YES 将事件传递下去,按钮就有点击事件触发

Marsory 约束后自定义的View ,view上的button会失去点击事件

在后台以NSString的形式的金额,在 用 floatValue进行转化的时候,如果金额是个整型的,那么个位数会被四舍五入掉,解决方法是 用 doubleValue进行转化

金额类型最好是long类型,以分为单位, 在转成钱的时候➗100.0

 NSURL *taobaoUrl = [NSURL URLWithString:@"taobao://"];
[[UIApplication sharedApplication] canOpenURL:taobaoUrl]  

这个是用来判断是否能打开淘宝,但是有时候这个判断会没有用,这个是因为没有在info.plist文件添加taobao

把描述文件全部删了在压包的时候会出现丢失xxx.morixxx 文件,这个要重新去安装描述文件,再把钥匙里面的发布的p12文件秘钥去掉,重新安装p12文件

出口合规信息  点否
广告标识付 点是  选第二个
越狱的手机在空对象调用 removeFromSuperView 会崩掉

AppIcon 的大小@2x 和@3x按顺序大小
20pt: 40x40, 60x60    29pt: 58 x 58, 87 x 87    40pt:80 x 80, 120 x 120     60pt:120 x 120, 180 x 180  
1024 x 1024
启动页 的大小是按顺序
1125 × 2436   1242 x 2208   750 x 1334    640 x 960   640 x 1136  

app加急 developer.apple.com//contact/ap…

app版权 可以参考 copyright ©️ jianjie Luo

在协议里面声明的属性是要去实现它的方法,在类里面声明的属性,系统会自动给出set和get方法

app更新数据都会被删除,包括NSUserDefaults, plist写入等都会被清除,但是用keychain方式保存就不会被删除

wkwebView无法保存cookie,是因为页面跳转没有携带cookie,需要我们手动去添加上

plist文件要打回车的话,用control+enter 就可以,还有就是先写好再复制进去

满一年续费了账号,会在开发网站上的Devices设备管理里面会显示这个,就可以重置账号的udid的设备,一旦添加或重置了,就无法再次重置,如果需要重置只能打电话给苹果技术,但是一年只能改1-2次

获取地理位置需要添加CoreLocation.framework 的库,不然获取不到

一般的情况下模拟器的版本号都是跟Xcode最新的版本一样,如果要测旧的系统版本的话在模拟器上添加旧的版本的iPhone型号,可能需要下载安装旧的系统版本

底层开发更多是考虑到安全方面的

要注意的是NSUserDefault存储的都是不可变(immutable)的数据,就算是将NSMutableArray存到NSUserDefault,读取出来之后还是会变成NSArray类型的。进行自定义对象的归档(转换为NSData类型)时需要实现NSCoding协议 需要注意的是,NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

在重写loadView方法的时候,不要调用父类的方法。包括 dealloc

NSArgumentDomain www.jianshu.com/p/be95cc4a2…

app更新和删除 NSUserDefault 和其他一些保存的数据会被删除, 但是用keychains 就算删除了app这个里面的东西也不会消失,一般用来保存token

SDWebimage 缓存是根据url,但是如果替换的图片内容,但是显示的还是之前的下载的图片,安卓那边的框架是对hash 进行判断,不会因为图片内容替换而没有去更新新的图片

NSUserDefault 不能存储可变数组和可变字典

// 放弃编辑器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
在除去NSString Block之外所有的对象应该声明为Strong
Weak 创建局部对象AddSubView之后 之后指向,这是错误的。因为你的指针只是被AddSubView保留,如果什么时候Remove 你的属性就为nil.
对于基本的数据类型一定要使用Assgin
对于XIB的属性使用Weak 代理,还有一些弱引用对象。  

po [self.view.window recursiveDescription] recursiveDescription这个是递归函数用来拿到该对象的所有子对象 也可以是po [[self.view recursiveDescription] toString]

GCD理解 www.cocoachina.com/ios/2016103…

Block 、delegate、 通知 注意事项 www.cnblogs.com/northWolves…

指定数组的类型,数组的对象就可以直接点调

@property (strong , nonatomic) NSMutableArray <CYButton*>*btnArr;
self.btnArr[j++].frame = rect;
rect.origin.x += rect.size.width;
rect赋值之后再去修改rect的属性,也可以修改到赋值的对象的值

题目好像是 char *c; c = a; char *c = a; 声明变量会申请内存 赋值不会申请内存

加密 用 公钥加密,私钥解密;签名是 私钥签名,公钥验签

NSString *string1 = @"/Library/preferenceLoader/preferences/Jfsm/xxx.png";
同等于
NSString *string2 = @"/Library/preferenceLoader"
                        "/preferences/"
                        "Jfsm/xxx.png";
同等于
#define JFFile(path) @"/Library/preferenceLoader/preferences/Jfsm/" #path;

字典添加空的value会崩溃

工程蓝色文件夹(folder)跟黄色文件夹(group)的主要区别是不参与编译 group并不会真正创建一个文件夹文件,该文件夹下的文件则会散乱的存放在工程根目录下 蓝色文件夹的文件也不能直接引用它们,若引用其中文件需要全路径。(一般放资源,比如html、css、js)

做完动画可能把子控件覆盖用下面的代码解决

//* 将子控件放在最上面,不然layer会覆盖 */
    [self bringSubviewToFront:self.categoryImageView];

Ios 网页html 加载本地资源(js、css、图片等)有两种方式

1、 NSString *imagePath2 = [[NSBundle mainBundle] pathForResource:@"home_play_icon@2x" ofType:@"png"];
 htmlStr1 = [htmlStr1 stringByReplacingOccurrencesOfString:string3 withString:[NSString stringWithFormat:@"file:///%@",imagePath2]];

第二种、 Html 里面的https:// 链接的内容直接是资源名字就好了

[_webView loadHTMLString:htmlStr1 baseURL:[[NSBundle mainBundle] bundleURL]];

提示rename failed 就clean 再改

自定义静态对象如何置空,我试过置空,但是无效

一、 .a是纯二进制文件 .framework中除了有二进制文件之外还有资源文件 二、.a文件不能直接使用,至少还有.h文件配合,.framework文件可以直接使用,因为本身包含了h文件和其他文件

未提交的App也不能删除

JHChainableAnimations 动画新的写法,快速简洁好用,类似于masonry的写法

iCarousel 轮播选择图片动画,像美团看电影那样,但是动画效果会多一点

pch文件中的声明被.mm引用了,才引起NSObjCRuntime, NSZone, and NSObject报错

iOS10.3后允许App运行中变更App图标

一定要制定main为入口,不指定的话window的rootv是显示不出来,这里被坑了很久很久

Cell 的宽度一开始默认都是320,高度是44

Tableview 如果只是单纯更新它的高度的话,用下面的方法不会调用创建cell,只会更新高度

[self.tableView beginUpdates];
[self.tableView endUpdates];

刚构建完的包发上去过一会就消失了(会发邮件到邮箱),可能是info.plist里面的权限没给,有些第三方需要相机和相册的权限,这两个这边都要给,

给控制器的view设置frame,会在设置frame赋值之前触发viewDidLoad方法

//  block回调
#define XM_SAFE_BLOCK(BlockName, ...) ({ !BlockName ? nil : BlockName(__VA_ARGS__); })
XMRequest *request = [XMRequest request];
XM_SAFE_BLOCK(configBlock, request);

国际化的修改app名成string文件名称一定是“InfoPlist.string”不然就不起作用 如果是要做app内容的国际化,string文件一定是“Localizable.strings”不然NSLocalizedString(@"TTRemindTitleInfo", nil)就获取不到,如果你的strings文件名字不是Localizable而是自定义的话,如wang.strings,那么你就得使用NSLocalizedStringFromTable()来读取本地化字符串

WKWebview是苹果为支持最新的Webkit功能,微信iOS客户端将升级为WKWebview内核

因此,对于 ReactiveCocoa 来说,我们可以毫不夸张地说,阻碍它发挥的瓶颈就只剩下你的想象力了。

【链接】iOS应用程序内购/内付费(一)

blog.csdn.net/shenjie1234…

后台税务信息当然也是要的

AppStore 创建下载收费App

www.jianshu.com/p/d7ad393b0…

请教下,各位混淆有用这个工具吗,3年没维护了,现在还能用吗? github.com/Polidea/ios…

1 AFNetworking 解析用的是NSJSONSerialization原生解析的,当我们服务器json数据有 S : 3.0 Android : 3.0 IOS : 2.999999 的bug 因为iOS默认是双精度的double(NSNumber) 解决方法是 3.0使用字符串或则使用NSInteger 类型,或则是在AFNetworking嵌套第三方解析 还有一个问题是Json解析失败 原因是json数据是碎片化就解析不出来,

解决方法是:在AFURLResponseSeriailzation.m里面的- (instancetype)serizlizer方法里面 将NSJSONReadingOptions 设置为可接受碎片化的解析 NSJSONReadingAllowFragments | 0 (所谓的碎片化是指不是字典开头的“{ }” 是以数组“[]”字符串开头的)

OC代码转成Swift代码的网站 ---》 黑科技 objectivec2swift.com/#/converter…

IP分为内网和外网,如果设备连接的是Wi-Fi,那么IP地址可能是192开头的局域网

delegate运行成本低。block成本很高的。delegate只是保存了一个对象指针,直接回调,没有额外消耗,block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;

app卸载重新安装后uuid就会发生变化跟上一次不一样,解决办法是把uuid放在kechain

给framework添加自定义的类或属性可以用runtime的关联对象

NSTimer加在main runloop中,模式是NSDefaultRunLoopMode,main负责所有主线程事件,例如UI界面的操作,复杂的运算,这样在同一个runloop中timer就会产生阻塞。

解决的方法,[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

Info.plist 报错和 libstdc++.6.0.9 juejin.cn/post/684490…

修改导航栏颜色 self.navigationController.navigationBar.backgroundColor = [UIColor blueColor]; self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

textView的内容不是从最上面开始的,而且还不能滚上去,当初真的被这种情况折腾的死去活来的,改frame,改约束,都没效果。后来才知道,当有导航控制器时,系统会默认将第一个添加的scrollView或其子类视图的内容下移64个像素,下面的textView是先添加的,所以其内容被下移了,而上面的却没有,解决方法是在控制器里加上下面这句代码 self.automaticallyAdjustsScrollViewInsets = NO;

iOS8才出来的,用来替换UISearchBar + UISearchDisplayController的组合方式,项目中有用到搜索功能,于是尝试着用了一下UISearchController,将搜索框添加到了tableView的tableHeaderView上。然而当点击搜索框准备搜索时,搜索框居然飞到九霄云外去了,解决如下 self.definesPresentationContext = YES;

xib圆角的设置代码:view.layer.cornerRadius = view.frame.size.height / 2;

企业级应用或inhouse 有关,和AppStore渠道的应用无关需要让手机信任这个应用 用户需要去 设置---》通用---》描述文件 里面自行添加信任

iOS9需要将你要在外部调用的URL scheme列为白名单,才可以完成跳转

[tableView reloadData]无效 有一行cell明明改变了但是刷新不出来。 感觉可能是这个方法和某种新加的特性冲突了,猜测可能是reloadData的操作被推迟到下一个RunLoop执行最终失效。

解决的方法是,注释[tableView reloadData],改用局部刷新,问题居然就解决了。 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

tableview刷新后页面“乱跑” 这是由于系统更新后,项目中没有使用estimateRowHeight属性 在appdelegate.m文件中,加上这几句代码:

//可以通过以下方式禁用
if (@available(iOS 11.0, *)) {UITableView.appearance.estimatedRowHeight = 0;
UITableView.appearance.estimatedSectionFooterHeight = 0;
UITableView.appearance.estimatedSectionHeaderHeight = 0;}

iOS8调用相机警告: 错误代码 :Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

IOS8多了一个样式UIModalPresentationOverCurrentContext,
IOS8中 presentViewController时请将控制器的modalPresentationStyle设置为 
UIModalPresentationOverCurrentContext, 问题解决

用代码创建了一个view后能显示,但无法响应触摸事件 出错原因:可能是父view的frame为CGZero

获取当前类的名字 [NSStringstringWithUTF8String:object_getClassName(self)];

向一个工程添加一个已有工程时,工程添加进去后,不能进行文件浏览,即只有一个工程文件在那里 原因:发现一个打开的工程已经添加了这个已有的工程 解决方法:将那个打开的工程关闭,就可以正常添加,并浏览文件了