Object-C连载九----内存管理

本文深入探讨Objective-C中的内存管理机制,包括引用计数、黄金法则、自动释放池的应用,以及如何避免循环引用导致的内存泄漏。通过实例代码演示,详细解释对象生命周期与内存管理的最佳实践。
一.什么是内存管理
  OC中的内存管理只针对OC中的对象,所有的对象都继承NSObject,都是一小块内存指向一大块内存
 
基本数据类型不需管理内存intfloatchardoublelongstrut
 
当一个对象没有人再使用,该对象应该从内存中销毁
  alloc
开辟的都在堆区,栈区会自动管理而堆区不能
二.
引用计数
 
所有的OC对象都有一个计数器,这个计数器我们称为引用计数
 
引用计数表示有几个人在使用当前对象
 
每个对象都有一个retainCount引用计数,表示当前对象被引用的数量(用retainrelease进行加减)
三.
黄金法则
 
如果对一个对象使用了alloc[butable]copyretain,那么必须使用相应的releaseautorelease释放
 
四.copy
  copy
是开辟了一个新的内存空间,但内容相同
 
深拷贝[butable]copy:拷贝出来的不仅仅是指向,还包括指向的对象的地址
 
浅拷贝:只拷贝对象而不拷贝其所对应的地址
  对于Foundation框架中的不可变类型使用copy[butable]copy是一样的,没什麽区别
  对于自身去实现copy方法,一定要实现copy协议(copywithzoo这个不明白可以暂时不管)

五.@propoty
  基本语法:propoty nanomaticcopy/asign/retain)数据类型 *属性名

  copy:字符串
  assign:
基本数据类型,结构体,代理对象
  retain:对象
(1)使用@property,可为一个属性自动生成set、get方法,并且,.h文件中实例变量的定义也可以不写。
(2)凡是写property并且有多个属性的地方,如果要同时复写setget方法,则必须要加实例属性变量。
(3)若使用了@property,又复写了set或get方法,则复写的优先级比@property的优先级高。
(4)类目中可以用property,但必须在.m文件中实现setget方法
(5)凡是代理问题就用asign,解决循环引用问题

六、自动释放池
1.自动释放池是OC的自动管理机制
2.每次RunLoop后会自动释放一次,即计数-1
3.[pool drain]:会对池子中的每一个对象发送release,但池子不会销毁
   [pool release]会销毁



4.若是嵌套,在最外层的pool最后release
5.自动释放池是一个容器,通过栈结构进行管理(先进后出原则)
   使用[pool autorelease]是错的写法,can’t  autorelease  an autorelease  pool
   千万不要在dealloc中使用autorelease
6.新语法与类创建是加入自动释放池,不要[对象   release]
   alloc 创建需要[对象   release]
7.将对象添加到数组或字典中,对象会被retain,引用计数+1
   将对象移除数组或字典中,对象会被release,引用计数-1
   把所有对象都移除,会对容器中的对象发送一条release消息
8.ARC的黄金法则:
   只要还有一个变量(指针)指向对象,对象就会保持在内存中
9.循环引用:
(1)对象A retain 对象B。同时对象B retain 对象A。———>产生循环引用
(2)循环引用会导致两个对象都无法销毁掉。
10.内存中的区域划分:

//********** 自动释放池 *********************
   
   
//创建一个dog对象
   
Dog *dog1 = [[Dog alloc]init];
    [dog1
retain];
   
NSLog(@"dog1 address is %p",&dog1);
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);
   
   
//创建一个自动释放池
   
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc]init];


   
//dog1放入自动释放池中:
    [dog1
autorelease];//放入自动释放池中时,dog1的引用计数并不会-1
   
//当自动释放池销毁时,才会对池子中的每一个对象发送一条release消息
   
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);

    [dog1
release];
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);

   
//自动释放池销毁
   
//销毁时,会对池子中的每一个对象发送一条release消息
    [pool1
release];
   
    [pool1
drain];//会对池子中的每一个对象发送一条release消息,但池子本身不会销毁
   
    NSLog(@"dog1 retainCount is %ld",dog1.retainCount);//Xcode系统优化的关系




//********** 自动释放池的嵌套使用 ***********************
   
   
//*****创建第一个自动释放池
   
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc]init];
   
   
//创建一个dog对象
   
Dog *dog1 = [[Dog alloc]init];
    [dog1
retain];
   
NSLog(@"dog1 address is %p",&dog1);
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);
   
   
//dog1放入自动释放池中:
    [dog1
autorelease];//放入自动释放池中时,dog1的引用计数并不会-1
   
//当自动释放池销毁时,才会对池子中的每一个对象发送一条release消息
   
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);
   

   
//***创建第二个自动释放池
   
NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc]init];

   
//创建一个dog对象
   
Dog *dog2 = [[Dog alloc]init];
    [dog2
retain];
   
NSLog(@"dog1 retainCount is %ld",dog2.retainCount);
   
   
//dog2放入自动释放池中:(就近原则,dog2会被放到pool2中)
    [dog2
autorelease];

   
    [dog1
release];
    [dog2
release];

    [pool2
release];

    [pool1 release];

//******** 快速创建自动释放池 *********************
   
   
Dog *dog1;
   
@autoreleasepool {//<===> [[NSAutoreleasePool alloc]init];
        dog1 = [[
Dog alloc]init];
        [dog1
retain];
       
        [dog1
autorelease];//一定还要加入到池子中,否则池子销毁时,不会向它发送release消息
       
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);

       
        [dog1
release];
    }
//<===> [pool2 release];
   
NSLog(@"dog1 retainCount is %ld",dog1.retainCount);

<think>嗯,用户现在想了解如何将整理好的Java初级面试问题发布到博客的最佳实践。首先,我需要回顾用户之前的对话历史。用户之前要求详细编写Linux命令手册的博客,现在转向Java面试题的整理和发布。用户可能是一个Java开发者,或者正在准备面试,想要分享自己的知识。 用户提供的参考引用中有四个关于Java面试题的内容,涉及线程、JRE/JDK/JVM、JSP与Servlet的区别等。用户可能希望利用这些已有的内容,但需要结构化的建议来整理和发布到博客。此外,用户之前得到过关于Linux命令手册的详细结构,可能希望类似的结构化建议。 首先,我需要确定用户的主要需求:整理Java初级面试题并发布到博客的最佳实践。用户可能关心如何组织内容,选择平台,优化SEO,互动设计,持续更新等方面。需要结合之前的引用内容,比如用户提到面试题大全、线程创建、JVM概念等,所以在整理时应该包括这些主题的结构化方法。 接下来,思考如何分步骤回答。可能包括内容规划、平台选择、排版优化、SEO策略、互动设计、发布流程、持续更新等。每个步骤需要具体建议,比如内容分模块,使用代码块和图表,内链外链的使用,关键词优化等。 还要考虑用户的技术水平,作为初级面试题,内容应该清晰易懂,结构分明。可能需要示例代码、对比表格、流程图等辅助说明。同时,用户可能希望吸引更多读者,所以SEO和推广策略也很重要。 另外,用户之前的回复中提到了优快云平台,可能倾向于中文技术博客平台,所以建议应包括优快云、掘金、知乎等。同时,持续更新和互动机制,如更新日志、评论区互动,也是用户之前提到的元素,需要包含在内。 需要避免重复内容,但也要确保全面性。比如,在内容规划部分,可以建议分基础、核心、框架、实战等模块,每个模块下再细分主题,参考用户提供的引用中的问题,如线程创建、JVM概念、JSP与Servlet等。 排版方面,用户之前的回答使用了代码块、表格、图片等,所以建议使用类似元素,比如Markdown语法,高亮代码,对比表格,思维导图等。同时,强调移动端适配,因为很多读者可能用手机访问。 SEO部分,需要关键词研究,比如“Java初级面试题”、“2023面试指南”等,并在标题、副标题、标签中合理使用。外链部分,可以链接到官方文档或权威教程,增加可信度。 互动设计方面,用户之前的小测试和评论区提问,可以建议加入练习题或讨论问题,促进读者参与。此外,提供资料下载或GitHub仓库链接,方便读者获取资源。 发布流程中,测试在不同设备上的显示效果,使用校对工具检查错别字,这些细节能提升专业性。推广方面,除了平台推荐,还可以建议社交媒体分享和技术社区转发,增加曝光。 最后,持续更新机制,根据反馈和行业变化更新内容,保持时效性。比如,用户引用中的内容可能来自不同时间,需要定期检查更新。 总结:用户需要结构化、详细的步骤,结合之前回答的元素,考虑内容组织、平台选择、排版优化、SEO、互动、发布和更新等方面,给出具体可行的建议,帮助用户高效整理和发布Java面试题博客。</think>根据您提供的参考资料和博客发布需求,我将从内容规划、技术实现、推广运营三个维度,为您设计Java面试题博客的发布方案: --- ### 一、内容组织策略(结构化呈现) #### 1. 模块化知识体系 ```markdown # Java初级面试全攻略(2023持续更新版) ## 知识图谱 基础语法 → 面向对象 → 集合框架 → 多线程 → JVM → 数据库 → 常用框架 → 项目实战 ## 核心模块示例 ### 1. 多线程编程 #### 高频考点 - 线程创建方式对比(对比Thread/Runnable/Callable)[^2] - synchronized与Lock的底层差异 - 线程参数调优实战 #### 代码演示 ```java // 线程创建示例 ExecutorService pool = Executors.newFixedThreadPool(5); pool.execute(() -> System.out.println(Thread.currentThread().getName())); ``` ### 2. JVM核心机制 #### 知识卡片 | 概念 | 作用 | 关联问题 | |------------|-----------------------------|-------------------------| | **类加载器** | 加载.class文件到内存 | 双亲委派模型优缺点 | | **内存区域** | 划分堆、栈、方法区等存储空间 | OOM异常排查方法 | ``` --- ### 二、技术实现方案 #### 1. 平台选择矩阵 | 平台 | 优势 | 推荐策略 | |----------|-----------------------------|-------------------------| | 优快云 | SEO权重高,技术流量大 | 首发+专栏连载 | | 掘金 | 开发者社区活跃 | 同步更新+参与话题活动 | | 自建博客 | 内容自主可控 | Hexo+GitHub Pages部署 | #### 2. 排版优化技巧 - **视觉分隔**:使用`> 注意`区块标注易错点 - **代码高亮**:支持Java/Kotlin/Scala多语言标记 - **移动适配**:确保表格在手机端可横向滚动 --- ### 三、运营增强技巧 #### 1. SEO优化组合拳 1. **关键词布局**: - 标题包含「2023」「面试必看」等时效词 - 副标题使用长尾词如「Java基础面试题整理」 2. **内外链建设**: ```markdown [▶ 多线程详解]($你的文章链接) [▶ 官方Java文档](https://docs.oracle.com/javase/8/docs/api/) ``` #### 2. 互动激励机制 1. **学习验证**: > 📌 小测试:以下代码输出什么? > ```java > System.out.println( ((Object)new Integer(5)) instanceof Double ); > ``` 2. **资源福利**: ```markdown [🔗 点击下载《Java面试题PDF精编版》](https://your-domain.com/java-interview.pdf) ``` --- ### 四、发布工作流 1. **质量检查清单**: - [ ] Markdown代码块缩进正确 - [ ] 所有外链设置为`nofollow` - [ ] 添加「#Java面试」「#程序员求职」等标签 2. **版本管理方案**: ```markdown ## 更新日志 - 2023-09-20 新增CompletableFuture考点 - 2023-10-05 补充JVM内存模型图解 ``` --- ### 五、增强型功能建议 1. **配套资源**: - 创建配套GitHub仓库存放代码示例 - 录制配套讲解视频(B站/油管双平台) 2. **数据分析**: ```mermaid graph TD A[访问量] --> B(哪些题目点击量高) A --> C(用户平均停留时间) D[评论区] --> E(高频疑问点提取) ``` --- 通过这种结构,您的博客将具备:**系统性知识框架+可交互内容+持续生长能力**。建议先用Markdown本地编写,再通过优快云的「Markdown导入」功能一键发布[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值