iOS优化 小知识
来源:互联网 发布:什么是元数据 编辑:程序博客网 时间:2024/06/16 00:19
1、layoutSubviews调用的调用时机
(1)当视图第一次显示的时候会被调用。
(2)添加子视图也会调用这个方法。
(3)当本视图的大小发生改变的时候是会调用的。
(4)当子视图的frame发生改变的时候是会调用的。
(5)当删除子视图的时候是会调用的。
2、让iOS应用直接退出
- (void)exitApplication {
AppDelegate *app = [UIApplication sharedApplication].delegate;
UIWindow *window = app.window;
[UIView animateWithDuration:1.0f animations:^{
window.alpha = 0;
} completion:^(BOOL finished) {
exit(0);
}];
}
3、NULL - nil - Nil - NSNULL的区别
* nil是OC的,空对象,地址指向空(0)的对象。对象的字面零值
* Nil是Objective-C类的字面零值
* NULL是C的,空地址,地址的数值是0,是个长整数
* NSNull用于解决向NSArray和NSDictionary等集合中添加空值的问题
这样的输出格式判断方法:
if(model.min_sku ==NULL){
}
这样的输出格式判断方法:
if( [model.min_sku isEqual:[NSNullnull]]){
}
4、控件不能交互的一些原因
1,控件的userInteractionEnabled = NO
2,透明度小于等于0.01,aplpha
3,控件被隐藏的时候,hidden = YES
4,子视图的位置超出了父视图的有效范围,子视图无法交互,设置了。
5,需要交互的视图,被其他视图盖住(其他视图开启了用户交互)。
5、视图的生命周期
1、alloc创建对象,分配空间
2、init (initWithNibName)初始化对象,初始化数据
3、loadView从nib载入视图,除非你没有使用xib文件创建视图
4、viewDidLoad载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear视图已在屏幕上渲染完成
1、viewWillDisappear视图将被从屏幕上移除之前执行
2、viewDidDisappear视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放.
viewVillUnload-当内存过低,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。
6、应用程序的生命周期
1,启动但还没进入状态保存:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2,基本完成程序准备开始运行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
3,当应用程序将要入非活动状态执行,应用程序不接收消息或事件,比如来电话了:
- (void)applicationWillResignActive:(UIApplication *)application
4,当应用程序入活动状态执行,这个刚好跟上面那个方法相反:
- (void)applicationDidBecomeActive:(UIApplication *)application
5,当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可:
- (void)applicationDidEnterBackground:(UIApplication *)application
6,当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反:
- (void)applicationWillEnterForeground:(UIApplication *)application
7,当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作:
- (void)applicationWillTerminate:(UIApplication *)application
7、判断view是不是指定视图的子视图
BOOL isView = [textView isDescendantOfView:self.view];
8、判断对象是否遵循了某协议
if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)]) {
[self.selectedController performSelector:@selector(onTriggerRefresh)];
}
9、设置状态栏文字样式颜色
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
10、MRC和ARC混编设置方式
在XCode中targets的build phases选项下Compile Sources下选择不需要arc编译的文件
双击输入 -fno-objc-arc 即可
MRC工程中也可以使用ARC的类,方法如下:
在XCode中targets的build phases选项下Compile Sources下选择要使用arc编译的文件
双击输入 -fobjc-arc 即可
11、把tableview里cell的小对勾的颜色改成别的颜色
_mTableView.tintColor = [UIColor redColor];
12、调整tableview的separaLine线的位置
tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);
13、设置滑动的时候隐藏navigationbar
navigationController.hidesBarsOnSwipe = Yes
14、性能相关
1. 视图复用,比如UITableViewCell,UICollectionViewCell.
2. 数据缓存,比如用SDWebImage实现图片缓存。
3. 任何情况下都不能堵塞主线程,把耗时操作尽量放到子线程。
4. 如果有多个下载同时并发,可以控制并发数。
5. 在合适的地方尽量使用懒加载。
6. 重用重大开销对象,比如:NSDateFormatter、NSCalendar。
7. 选择合适的数据存储。
8. 避免循环引用。避免delegate用retain、strong修饰,block可能导致循环引用,NSTimer也可能导致内存泄露等。
9. 当涉及到定位的时候,不用的时候最好把定位服务关闭。因为定位耗电、流量。
10. 加锁对性能有重大开销。
11. 界面最好不要添加过多的subViews.
12. TableView如果不同行高,那么返回行高,最好做缓存。
13. Viewdidload里尽量不要做耗时操作。
15、响应者链条顺序
1> 当应用程序启动以后创建UIApplication对象
2> 然后启动“消息循环”监听所有的事件
3> 当用户触摸屏幕的时候, "消息循环"监听到这个触摸事件
4> "消息循环"首先把监听到的触摸事件传递了UIApplication对象
5> UIApplication对象再传递给UIWindow 对象
6> UIWindow对象再传递给UIWindow 的根控制器(rootViewController)
7> 控制器再传递给控制器所管理的view
8> 控制器所管理的View在其内部搜索看本次触摸的点在哪个控件的范围内(调用Hit test检测是否在这个范围内)
9> 找到某个控件以后(调用这个控件的touchesXxx方法),再一次向上返回,最终返回给"消息循环"
10> "消息循环"知道哪个按钮被点击后,在搜索这个按钮是否注册了对应的事件,如果注册了,那么就调用这个"事件处理"程序。(一般就是执行控制器中的"事件处理"方法)
16、UIApplication的简单使用
--------设置角标数字--------
//获取UIApplication对象
UIApplication *ap = [UIApplication sharedApplication];
//在设置之前,要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.
UIUserNotificationSettings *notice =
[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
//注册通知对象
[ap registerUserNotificationSettings:notice];
//设置提醒数字
ap.applicationIconBadgeNumber = 20;
--------设置联网状态--------
UIApplication *ap = [UIApplication sharedApplication];
ap.networkActivityIndicatorVisible = YES;
--------------------------
17、iOS横向滚动的scrollView和系统pop手势返回冲突的解决办法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}
18、UIView初始化
- (id)initWithFrame:(CGRect)frame
{
self = [superinitWithFrame:frame];
if (self) {
}
return self;
}
19、复制链接
#pragma mark -复制链接到剪贴板
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
NSURL *url=[NSURL URLWithString:[shareDic objectForKey:@"url"]];
pboard.URL=url;
20、跳转到设置界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General&path=Keyboard"]];
prefs:root=General&path=About
prefs:root=General&path=ACCESSIBILITY
prefs:root=AIRPLANE_MODE
prefs:root=General&path=AUTOLOCK
prefs:root=General&path=USAGE/CELLULAR_USAGE
prefs:root=Brightness
prefs:root=General&path=Bluetooth
prefs:root=General&path=DATE_AND_TIME
prefs:root=FACETIME
prefs:root=General
prefs:root=General&path=Keyboard
prefs:root=CASTLE
prefs:root=CASTLE&path=STORAGE_AND_BACKUP
prefs:root=General&path=INTERNATIONAL
prefs:root=LOCATION_SERVICES
prefs:root=ACCOUNT_SETTINGS
prefs:root=MUSIC
prefs:root=MUSIC&path=EQ
prefs:root=MUSIC&path=VolumeLimit
prefs:root=General&path=Network
prefs:root=NIKE_PLUS_IPOD
prefs:root=NOTES
prefs:root=NOTIFICATIONS_ID
prefs:root=Phone
prefs:root=Photos
prefs:root=General&path=ManagedConfigurationList
prefs:root=General&path=Reset
prefs:root=Sounds&path=Ringtone
prefs:root=Safari
prefs:root=General&path=Assistant
prefs:root=Sounds
prefs:root=General&path=SOFTWARE_UPDATE_LINK
prefs:root=STORE
prefs:root=TWITTER
prefs:root=General&path=USAGE
prefs:root=VIDEO
prefs:root=General&path=Network/VPN
prefs:root=Wallpaper
prefs:root=WIFI //跳转到网络设置界面
21、UIImage加载方法
1.在添加图片操作时,通过UIImage对象进行添加图片操作
1.[UIImage imageName:@"1.png"]
2.[UIImage imageWithContentsOfFile:@"1.png"]
注:ImageNamed和imageWithContentsOfFile的区别
imageNamed加载图片并缓存,并且把image缓存到内存里面,当图片较少并且会频繁的使用时用imageNamed;
imageWithContentsOfFile是只显示图片,但不加到内存中。 所以加载大量图片的时候用imageWithContentsOfFile比较好,内存不会变大。
阅读全文
1 0
- iOS优化 小知识
- iOS零碎小知识
- IOS小知识
- IOS开发小知识
- IOS 小知识总结
- ios开发小知识
- iOS开发小知识
- iOS开发小知识
- ios 知识小积累
- iOS中的小知识
- ios 小知识
- iOS后台小知识
- ios小知识
- iOS开发小知识
- ios 小知识集锦
- iOS小知识
- iOS小知识汇总
- iOS 小知识
- jsp中自定义tag标签
- 'GridSearchCV' object has no attribute 'cv_results_' 这一问题的解决
- 四、单例模式
- 串口通信校验方式(even,odd,space,mark)UART数据波形分析
- Steamroller
- iOS优化 小知识
- Android的资源获取的相关方法
- Linux系列课程之二基础环境搭建
- 懒加载的原理与实现
- 139. Word Break
- ssm中java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- error C3861,找不到标识符
- 关于android项目的全局配置——config.gradle
- Linux JDK安装与卸载