IOS开发的基础知识建议收藏

1.为什么对一个变量release后还要设为nil对一个变量release后,这个变量指向的内存释放了,但这个变量本身没变,仍指向原来的内存地址。若这个变量在释放后被访问,或者被重复release,

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

1.为什么对一个变量release后还要设为nil

  对一个变量release后,这个变量指向的内存释放了,但这个变量本身没变,仍指向原来的内存地址。若这个变量在释放后被访问,或者被重复release,就会导致应用崩溃。设为nil后这个变量指向0×00,可以保证程序以后访问不到原先的内存地址,对nil进行release也没任何问题。

2.
使用类成员时,前面加不加self.有什么区别

  不加self.调用的是成员本身,加self.后实际上调用了其成员的get set方法。

  例:

  //.h

  @property (nonatomic, retain) NSString *name

  //.m

  name = @”bang” //没有retain,随时会被释放

  NSString *str = self.name //等于NSString *str = [self name];

  self.name = @”bang” //等于[self setName:@”bang”]; 这时在set方法里retain了这个字符串

3.内存泄漏

  可以通过xcode的编译工具Product-Analyze检查函数块范围内可能的泄漏点(外带会提示一些可能有的错误)。

  用leaks工具监测出来的泄漏查找方法是跟踪其代码提示中出现的变量,经常这个变量是在提示的调用堆栈以外的地方泄漏的。若实在查不到,最终办法是重写这个变量的retain和release方法,debug,从调用堆栈看是谁retain了它而没有release。

  要注意的是,用CFXXCreate(例如CFArrayCreate)生成的变量要用CFRelease释放。

4.数据存储

  如无搜索需要,可以将一个数据对象直接序列化后存到sqlite,取出时直接反序列化为对象使用。序列化需要数据类实现NSCoding协议,实现encodeWithCoder和initWithCoder两个方法就行,若有多个数据对象,可以写个基类实现这两个方法,并在这里面利用反射枚举自身所有变量去encode和decode,一劳永逸,具体实现网上找找就有了。

5.UINavigationController头尾显示隐藏

  在用NavigationController去管理view的push和pop时,需要根据不同的view设置是否显示NavigationBar和ToolBar,一开始在错误的地方设置了,导致有时该显示NavigationBar和ToolBar时不显示的情况,后来发现在viewWillAppear上设置万无一失。别笑我土鳖,没好好去理解它整个流程,一直没发现。

  - (void) viewWillAppear:(BOOL)animated{

  [super viewWillAppear:animated];

  [self.navigationController setToolbarHidden:NO];

  [self.navigationController setNavigationBarHidden:NO];

  }

6.UITableView游标式渲染

  tableView的机制大概是:先定好总行数,某一行滚入视图范围时,回调一个函数去取view出来显示。这一行滚出视图再滚入时仍会继续回调这一函数取view。有这样的机制就是说无论你table里的数据有多少,都可以全部放入table中不用分页,因为不用一次性把所有数据都取出来,只在需要显示的时候根据游标去取对应的数据就行了。

  可能这是APP组件很自然的方式不用说明,但在web上页面上的数据和元素都是要一次性载入内存的,做久了web,一开始没想到它这样的实现机制,导致我们走了不少弯路。

7.UIWebView渲染范围

  UIWebView不是根据可视范围决定每次的渲染范围,而是根据自身控件的frame大小决定。

  曾尝试webview嵌在tableview里,为了让webview跟tableview一起滚动,把webview的大小设为webview里的内容大小,让webview不出滚动条,从而能跟着tableview的滚动条一起滚。这样做的后果是每次webview都一次性渲染整个页面,内存占用多性能很差,而且在放大缩小这个webview时,渲染放大的整个页面更吃力,出现不能忍受的性能。解决办法是让webview定住高度为一整屏iphone的高度,限制了webview每次的渲染范围为可视范围,性能大好。带来的问题是无法随tableview滚动,但可以以其他方式优化体验。最近看到新版的ZAKER也是这样做的。

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120722.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker-compose 集群_docker集群管理

    docker-compose 集群_docker集群管理前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有

    2022年7月30日
  • volatile指令重排[通俗易懂]

    volatile指令重排[通俗易懂]什么时候会发生指令重排?先来一个测试指令重排现象,下面这段代码会发生指令重排,也就是JVM优化了执行顺序。/***指令重排测试*/publicclassCommandDisorder{//当使用volatile关键词修饰变量时,则不会出现指令重排现象privatestatic/*volatile*/inta=0,b=0,c=0,d=0;/***测试方式:一次开启两个线程,同时修改变量*/

    2022年10月10日
  • springmvc的执行流程详解[通俗易懂]

    1.什么是MVCMVC是ModelViewController的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet)第二步:前端控制器请求HandlerMapping查找Handler        可以根据xml配置、注解进行查找第三步:处理器映射器Handle

    2022年4月4日
  • 谈vuex的…mapGetters

    谈vuex的…mapGetters谈vuex的…mapGetterscomputed:{…mapGetters([‘test’]),}我们在vue文件中就可以直接this.test来访问vuex中的属性了。但是…mapGetters是什么?mapGetters前用了扩展运算符”…”functionfn(){ return{a:1,b:2};}//如mapGettersvara={…

    2022年6月11日
  • Enterprise Library 验证的实现

    Enterprise Library 验证的实现参考地址:http://www.cnblogs.com/huangcong/archive/2010/06/03/1749634.htmlEnterpriseLibrary的验证我觉得最大的改变了验证的位置,可以通过配置文件来修改验证规则,这就极大的使验证更加灵活,原文中的一个错误就是第一步让点击 AddDatabaseSettings这个地方错了,应该点击AddSecuritySe…

    2022年10月20日
  • java cloneable 接口_Cloneable 接口 记号接口(标记接口)「建议收藏」

    java cloneable 接口_Cloneable 接口 记号接口(标记接口)「建议收藏」Cloneable接口指示了一个类提供了一个安全的clone方法。首先了解Object.clone()方法:clone是Object超类的一个protected方法,用户代码不能直接调用这个方法。Object的子类只能调用Object超类中受保护的clone方法来克隆它自己的对象,必须重新定义clone为public才能允许所有方法调用这个类的实例的clone方法克隆对象。clone方法的作用:…

    2022年8月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号