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的区别
* nilOC的,空对象,地址指向空(0)的对象。对象的字面零值
* NilObjective-C类的字面零值
* NULLC的,空地址,地址的数值是0,是个长整数
* NSNull用于解决向NSArrayNSDictionary等集合中添加空值的问题

这样的输出格式判断方法:
if(model.min_sku ==NULL){
}

这样的输出格式判断方法:
if( [model.min_sku isEqual:[NSNullnull]]){

}


4、控件不能交互的一些原因
1,控件的userInteractionEnabled = NO
2,透明度小于等于0.01aplpha
3,控件被隐藏的时候,hidden = YES
4,子视图的位置超出了父视图的有效范围,子视图无法交互,设置了。
5,需要交互的视图,被其他视图盖住(其他视图开启了用户交互)。

5、视图的生命周期
1alloc创建对象,分配空间
2init (initWithNibName)初始化对象,初始化数据
3loadViewnib载入视图,除非你没有使用xib文件创建视图
4viewDidLoad载入完成,可以进行自定义数据以及动态创建其他控件
5viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6viewDidAppear视图已在屏幕上渲染完成

1viewWillDisappear视图将被从屏幕上移除之前执行
2viewDidDisappear视图已经被从屏幕上移除,用户看不到这个视图了
3dealloc视图被销毁,此处需要对你在initviewDidLoad中创建的对象进行释放.

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、MRCARC混编设置方式
XCodetargetsbuild phases选项下Compile Sources下选择不需要arc编译的文件
双击输入 -fno-objc-arc 即可

MRC工程中也可以使用ARC的类,方法如下:
XCodetargetsbuild phases选项下Compile Sources下选择要使用arc编译的文件
双击输入 -fobjc-arc 即可


11、把tableviewcell的小对勾的颜色改成别的颜色
_mTableView.tintColor = [UIColor redColor];

12、调整tableviewseparaLine线的位置
tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

13、设置滑动的时候隐藏navigationbar

navigationController.hidesBarsOnSwipe = Yes

14、性能相关
1. 视图复用,比如UITableViewCell,UICollectionViewCell.
2. 数据缓存,比如用SDWebImage实现图片缓存。
3. 任何情况下都不能堵塞主线程,把耗时操作尽量放到子线程。
4. 如果有多个下载同时并发,可以控制并发数。
5. 在合适的地方尽量使用懒加载。
6. 重用重大开销对象,比如:NSDateFormatterNSCalendar
7. 选择合适的数据存储。
8. 避免循环引用。避免delegateretainstrong修饰,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")]) {
        // 再判断系统手势的statebegan还是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比较好,内存不会变大。


原创粉丝点击