iOS 主线为什么有颜色要在主线

关于IOS版模拟人生的主线任务问题_百度知道
关于IOS版模拟人生的主线任务问题
下的是IOS模拟人生免费版,版本5.16,主线任务刚开始要移动台灯,但是点了半天没反应,也移动不了,其他都正常,所以任务进行不下去了~~~求解~~~手机未越狱,下的是APP STORE上的正版
您的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励30(财富值+成长值)
我有更好的答案
你好,出现这种情况估计是由于游戏文件损坏导致的,建议你重新安装一下游戏,然后下个存档直接玩。
为您推荐:
其他类似问题
您可能关注的内容
模拟人生的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51CTO旗下网站
写给iOS初学者
《iOS开发之美》本书是一本初学者都看得懂的图书,作者从iOS开发的三个主线――Storyboard、Delegate和TableView入手,以自己开发过的App为基础,循序渐进地讲述了在iOS开发过程中面对的技术问题。本节是写给iOS初学者。
作者:和凌志来源:电子工业出版社| 23:18
写给iOS初学者
编者按:&写给iOS初学者&是作者为iOS初学者量身定制的技术路线,深受网友好评,在此,以飨读者。
谈到iOS的学习,一下子将我和我的团队带到六年前的时光。
记得那是2007年,我们拿到了传说中的iPhone,做的第一件事情就是&越狱&。那时的iPhone,不越狱是打不了电话的。越狱的过程充满了提心吊胆,唯恐一不小心把iPhone变成&砖头&。
多少年来,我一直在手机软件行业摸爬滚打。作为一名软件工程师,自然想在iPhone上开发一款属于自己的App。终于等到2008年10月,Apple开放了SDK,自此,我们开始走向了正轨,加足马力,先后发布了几款极具商业价值的App,并打造了属于自己的移动互联网平台。
历经六年的迅猛发展,iOS开发如日中天。这一方面得益于国内广泛的iOS(iPhone/iPad)用户基础;另一方面,iOS开发平台本身,也为开发者提供了一个先天的优势。这里绝不是厚此薄彼,早在开发iOS之前,我们也曾在Nokia塞班平台上开发过软件,所经历的痛苦,可用一句话形容&&&谁用谁知道&。至于Android平台,我们不想谈及太多。为对比几大平台的优劣,而引发口水战,大可不必。相信你读到这里时,对选择哪个开发平台,你已经有了自己的主见。
很多人在看了我们的App之后,经常问:你们最初是怎么学iOS的?
谈起我们初学iOS,忍不住有很多话要吐槽。这个过程依然是很艰难的。iOS开发的门槛较高,一个硬件设备,比如苹果电脑,足以把很多跃跃欲试者挡在了门外。我们也尝试过虚拟机的安装,也就是业内所说的&黑苹果&。对于&黑苹果&,我的感悟是,玩玩还行,若真的要下决心做事,还得MacBook。最初接触iOS开发时,我用过&黑苹果&。所谓&黑苹果&,就是在Windows操作系统上装一个MacOS虚拟机。当时购买苹果电脑(MacBook),是一笔不小的开销。后来决定从事iOS开发时,最终还是痛下决心,购置了MacBook。学习iOS,常被开发环境所困扰。为装一台&黑苹果&,折腾一周算是正常,这还得运气好。在开发环境的搭建上,浪费太多的时间,得不偿失。对任何人来讲,时间才是最宝贵的财富,每个人都应该把时间投入到最有意义、最有影响的地方去。没有投入,就没有产出。如果你狠心买了MacBook,想必会坚持学好iOS,正所谓&舍不得孩子套不着狼&。
在iOS开发的旅途中,曾记录了我们多次瞬间的喜悦与感动:
当成功注册为iPhone开发会员(iPhone Developer Program,IDP)那一瞬间;
当iPhone SDK开发环境配置成功,显现&Hello World&的那一瞬间;
当一款自己精心设计的应用程序得以实现的那一瞬间;
当应用程序成功签名并在iPhone手机上随手指的触动而飘逸的那一瞬间;
当应用程序成功发布到AppStore上,收到来自Apple的E-mail,赫然标识&Ready for sale&的那一瞬间。
作为iOS初学者的你,相信在未来的开发之旅中,也会经历一些困惑与喜悦。这里,先送上一句鼓励的话:&含泪播种,必将微笑收割。&
我经常被问到的第二个问题是:iOS开发从何入手?
iOS开发没有什么神秘的地方,就开发一个App来说,这个平台已经足够强大了。iOS的版本发布虽然很频繁,但从技术框架的角度来看,iOS里程碑式的发布,主要体现在iOS5 SDK的发布,对应的XCode版本是4.2,此版本引入Storyboard技术。以我之拙见,Storyboard技术才是iOS开发框架的分水岭。至于其他版本的发布,对iPhone手机用户来讲,有多个亮点和创新,但与iOS开发者关系不大。
这里重点吹捧下Storybord技术。在我看来,Storybord技术的出鞘,让其他任何手机平台难以望其项背。试想一下,所有的App,从用户体验的角度看,不就是在多个页面之间跳来跳去么?为实现页面之间的跳转而编写大量的代码,有人愿意这么做吗?大多平台,不得已而为之。而苹果公司发布的XCode 4.2版本,通过引入Storyboard技术,成功地解决了这个问题。花大量时间,来实现页面之间的跳转逻辑,对程序员来说,这是一种简单而重复的劳动。只有工作量,缺乏技术含量。Storyboard技术的推出,使得iOS开发者能够以最快的速度,以最低的成本开发出一款App,这本身不就是强有力的竞争力么?
说了这么多,其实就为了表达一句话:学习iOS开发,一定要善用Storyboard技术。
iOS平台所涵盖的知识点浩瀚无垠,如何找到一条主线,将这些知识点贯穿起来?不妨,我们还是从App本身的特点来寻找答案吧。几乎所有的App,无非解决两个问题&&UI展示和数据处理。
我们先来看看数据的展示。移动互联网应用的核心在于用户体验上,而绝妙的用户体验正是集中体现在如何流畅地展示数据。iPhone手机最为经典的数据展示页面,莫过于电话本。几千个电话号码,通过上下滑动而一览无余。为此,iOS SDK推出了表视图(TableView)技术,有效地解决了数据展示的问题。
接下来,再看看数据的交互。我们知道,每个App都是由多个页面组成的,用户在使用时,会触摸页面上的对象,页面之间也会前后跳转。其实,页面之间的跳转必将引发数据的交互。如何解决好数据的交互问题呢?iOS SDK正是借助Delegate这个设计模式,有效地解决了这一问题。
最后,又回到了UI的实现上来,正是为实现页面的跳转和页面之间的数据交互,Apple才引入了Storyboard技术。Storyboard技术才是真正意义上的王者归来。Storyboard让整个App开发的世界,变得如此简单而有趣味。
至此,或许你已经清楚了这本教程的主线,那就是Storyboard+Delegate+TableView。我们所讲述的所有实例,都是在剥茧抽丝,从多个维度来阐述这条主线的。
学iOS开发,还需要了解很多相关的知识。你需要注册Apple ID;如果想发布到AppStore,还需要注册苹果开发者账号,还要熟悉发布过程。诚然,了解和掌握这些知识点,是很重要的。但是,这些点都是对iOS开发流程相关的理解,涉及的技术知识点不多。如果将iOS周边知识点纳入到这本书中,将占大量的篇幅,就有点儿喧宾夺主了。
说一千道一万,还是那句老话,教程本身不是万能的。每个人的基础不一样,对同一个教程的领悟也不相同。我们所做的,就是帮你在iOS学习的旅途上找回信心;让你在遇到问题时,不再感到孤独无助。当你自己精心开发的App发布到AppStore的那一天,蓦然回首,你会发现,过去付出的一切,都是值得的!
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:268708人学习过
讲师:228054人学习过
讲师:12046人学习过
精选博文论坛热帖下载排行
本书第1版曾被KDnuggets的读者评选为最受欢迎的数据挖掘专著,是一本可读性极佳的教材。它从数据库角度全面系统地介绍了数据挖掘的基本概念...
订阅51CTO邮刊IOS开发为什么使用多线程
多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径
在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。
然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务。
概要提示:
iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone
OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的能力
一、线程概述
有些程序是一条直线,起点到终点——如简单的hello
world,运行打印完,它的生命周期便结束了,像是昙花一现。
有些程序是一个圆,不断循环直到将它切断——如操作系统,一直运行直到你关机。
一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。
Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程。主线成在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的操作必须在主线程进行。
系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。
每创建一个新的进成,都需要一些内存(如每个线程有自己的stack空间)和消耗一定的CPU时间。
当多个进成对同一个资源出现争夺的时候需要注意线程安全问题
创建一个新的线程就是给进程增加一个执行流,所以新建一个线程需要提供一个函数或者方法作为线程的进口。
1.使用NSThread
&NSThread提供了创建线程的路径,还可以提供了监测当前线程是否是主线程的方法
&使用NSThread创建一个新的线程有两种方式:
&1.创建一个NSThread的对象,调用Start方法——使用一个目标对象的方法初始化一个NSThread对象,或者创建一个继承自NSThread的子类,实现起main方法?,然后在直接创建这个子类的对象。
&2.使用detachNewThreadSelector:toTarget:withObject:这个类方法创建一个子线程,这个比较直接,直接使用目标对象的方法作为线程启动入口
2.使用NSObject
& & &使用NSObject直接就加入了对多线程的支持,允许对象的某个方法在后台运行。
& & [my0bj
performSelectorInBackground:@selector(doSomething)
withObject:nil];
3.POSIX Thread
由于Mac和IOS都是基于Darwin系统,Darwin系统的UNX内核,是基于mach和BSD的,继承了BSD的POSIX接口,所以可以直接使用POSIX线程的相关接口开实现线程
& &创建线程的接口为 pthread_create,
当然在创建线程之前可以创建好相关线程的属性
——————————————————————————————————————
NSOperation&NSOperationQueue
&很多时候我们使用多线程,需要控制线程的并发数,毕竟线程也是需要消耗系统资源的,当程序中同时运行的线程过多时,系统必然变慢,所以很多时候我们会控制同时运行线程的数目
&NSOperation可以封装我们的操作,然后将创建好的NSOperation对象放到NSOperationQueue队列中,OperationQueue便开始启动新的线程去执行队列中的操作,OperationQueue的并发数时可以通过如下方式进行设置的:
&-&(void)setMaxConcurrentOperationCount:(NSInteger)count&
GCD时Grand central
Dispatch的缩写,是一系列BSD层面的接口。在mac10.6和IOS4.0以后才引入的
且现在NSOperation和NSOperationQueue的多线程的实现就是基于GCD的。目前这个特性也被移植到
FreeBSD上了,可以查看libdispatch这个开源项目。
dispatch_queue_t&imageDownloadQueue&=&dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,&0);&
当然,GCD除了处理多线程外还有很多非常好的功能,其建立在强大的kqueue之上,效率也能够得到保障。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。alloc、init你弄懂50%了吗? - IOS - 伯乐在线
& alloc、init你弄懂50%了吗?
这是一篇我记录对alloc、init分析思考的笔记。如果读者想看懂我的第二个思考,可能需要您至少了解内存的分段分页管理,如果您对其一点都不知道,可以先看这篇软文简单了解一下。另外很重要的一点是,请先思考。
思考1.对象为什么要alloc,init又是干嘛的?
很多人都知道,初始化一个对象应该这么写:
MyClass* myObj = [[MyClass alloc] init];
MyClass* myObj = [[MyClass alloc] init];
那么有没有思考过为什么呢?其实我这么写也是完全可以的:
Objective-C
MyClass *myObj = [MyClass alloc];
myObj = [myObj init];
MyClass *myObj = [MyClass alloc];myObj = [myObj init];
我们来看看这干了啥。
alloc allocates a chunk of memory to hold the object, and returns the pointer.
就是说alloc分配了一坨 内存给对象,让它不释放,并且把地址返回给指针。
Objective-C
MyClass *myObj = [MyClass alloc];
MyClass *myObj = [MyClass alloc];
那么这样过后myobj为什么不能被使用呢?这是因为这片内存还没有被正确的初始化。
举个栗子,万达要修房子,他们第一步一定是要先向政府搞到一块地,第二步才能在这块地上动工修楼。
这里操作系统就是政府,alloc就是去争地,init就是在地上修房子。没有调用init,房子都没有修好,别人怎么买房进去住?所以我们需要用init来初始化这片内存:
Objective-C
self=[super init]; // 1.
-init{&&&& self=[super init]; // 1.&&&& if(self){&&&&&&&&&&// 2.&&&&&&&& ....&&&& }&&&& return self;&&&&&& // 3.}
第一步需要初始化父类的信息,比如实例变量等等。可以理解成王思聪在修房子前要询问他老爸的意见,他老爸说想娱乐会所,他没有意见的话就会修成娱乐会所,他如果有意见,就可以悄悄的在第二步里面改为修成LOL俱乐部。第三步就不说了。
最后提醒一下,不要这样写:
Objective-C
MyClass* myObj = [MyClass alloc];
myObj=[myObj init];
MyClass* myObj = [MyClass alloc];myObj=[myObj init];
因为你可能会忘记在第二行加init,并且代码也会增长。
思考2.关于alloc的思考
在思考1中我们说了:alloc分配了一坨 内存给对象,让它不释放,并且把地址返回给指针。这里主要有两个问题:
调用alloc后内存是直接映射到堆还是只分配给了虚拟内存?
这一坨内存到底是多大?
我们依次来展开。
可能有些读者不明白第一个问题是什么意思,这里需要额外讲一些关于内存的东西,其实这是iOS开发很重要的东西,不管是面试还是学习都可能会用到。
额外的东西
iOS里的内存是有分类的,它分成Clean Memory和Dirty Memory。顾名思义,Clean Memory是可以被操作系统回收的,Dirty Memory是不可被操作系统回收的。
Clean Memory:在闪存中有备份,能再次读取重建。如:
Code(代码段),framework,memory-mapped files
Dirty Memory:所有非Clean Memory,如:
被分配了的堆空间,image cache
举个栗子,在这样的代码中:
Objective-C
- (void)dirtyOrCleanMemory
NSString *str1 = [NSString stringWithString:@"Welcome!"]; // 1.
NSString *str2 = @"Welcome"; // 2.
char *buf = malloc(100 * 1024 * 1024); // 3.分配100M内存给buf
for (int i = 0; i & 3 * 1024 * 1024; ++i) {
buf[i] = rand();
// 4.buf的前3M内存被赋值
1234567891011
- (void)dirtyOrCleanMemory{&&&&NSString *str1 = [NSString stringWithString:@"Welcome!"]; // 1.&&&&NSString *str2 = @"Welcome"; // 2.&&&&&&&&char *buf = malloc(100 * 1024 * 1024); // 3.分配100M内存给buf&&&&&&&&for (int i = 0; i & 3 * 1024 * 1024; ++i) {&&&&&&&&buf[i] = rand(); &&&&}
// 4.buf的前3M内存被赋值}
对每行分析:
1.Dirty Memory。
因为stringWithString:是在堆上分配内存的,如果我们不回收它的话,系统会一直占用这块内存。
2.Clean Memory。
因为用这样的方法创建的是一个常量字符串,常量字符串是放在只读数据段的,如果这块内存被释放了,而我们又访问它的时候,操作系统可以在只读数据段中把值再读取出来重建这块内存。(ps:所以用这种方法创建的string是没有引用计数的。)
接下来的知识就是引出思考问题1、2比较重要的点了:
3.Clean Memory。
这个时候buf指向的100M内存区域是Clean Memory的,因为操作系统是很懒的,只有当我们要用到这块区域的时候才会映射到物理内存,没有使用的时候只会分配一块虚拟内存给buf。读起来很绕口,上张图:
可以看到虚拟内存和物理内存没有映射关系,所以是Clean Memory的。
4.Dirty & Clean Memory混合。
前3M是Dirty Memory,后97M是Clean Memory。这句for语句执行完成后,buf的前3M内存被赋值,也就是buf的前3M被使用了,所以这个时候的映射关系是这样的:
额外的东西Done.
调用alloc后内存是直接映射到堆(物理内存)还是只分配给了虚拟内存?
一坨内存的一坨是多大?
这个时候我们的第一个问题读者应该能明白了。那么我们怎么验证alloc是直接映射到堆上还是只分配给虚拟内存呢?这个问题让我想了好些天,最后xo哥想到了一剂良药来验证,那就是用instrument来推反。
使用instrument来证反
我们假设的论点是:对象收到alloc消息后只在虚拟内存分配空间。
这里需要一丁点代码。
1.我们随便新建个工程。
2.然后做个model类:
Objective-C
#import &Foundation/Foundation.h&
@interface XOModel : NSObject
NSString *a2;
#import &Foundation/Foundation.h&&@interface XOModel : NSObject{&&&&int a1;&&&&NSString *a2;}&@end
3.在controller里给view加一个点击事件:
Objective-C
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
for (int i = 0; i & 100000; ++i) {
XOModel *model = [XOModel alloc]; // 注意这句只有alloc
[self.array addObject:model];
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {&&&&for (int i = 0; i & 100000; ++i) {&&&&&&&&XOModel *model = [XOModel alloc]; // 注意这句只有alloc&&&&&&&&[self.array addObject:model];&&&&}}
4.打开instrument的alloction,运行触发一下点击事件,查看如下:
(图解:Persistent bytes表示所有的这类东西在堆里的大小,Persistent表示所有的这类东西的个数.)
我们发现发现在Persistent bytes(堆)里实实在在地分配给了XOModel 3.05MB的空间。
我们再触发一下点击事件:
发现堆分配给了XOModel的大小空间变成了原来的两倍6.10MB。
结论过渡:如果对象收到alloc消息只在虚拟内存分配空间,那么persistent bytes(堆)里是不会分配给XOModel大小的,也就是说这里的persistent bytes大小应该是0。所以问题1的结论如下:
结论:alloc不只分配在虚拟内存,同时会在物理内存建立映射。
对象的内存分配
最后剩下我们的最后一个问题:类对象收到alloc消息后,操作系统会分配出来的一坨内存是多大?
3.05M的大小是100000个XOModel对象的总和,那么一个XOModel的实例对象,操作系统会给他分配多大的空间呢?很简单嘛,3.05M/100000就得到了,等等,难道你真准备这样去算?好吧,其实一开始我真这样想过,但是这肯定是算不出准确答案的,关键是你要去思考。
这里有两种办法,我采用的第二种办法。
第一种验证方法还是instrument
我们可以修改一下触发的代码,然后重新刷新instrument查看XOModel大小,具体操作同上,不重复了:
Objective-C
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
for (int i = 0; i & 1; ++i) { // 修改处
XOModel *model = [XOModel alloc]; // 注意这句只有alloc
[self.array addObject:model];
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {&&&&for (int i = 0; i & 1; ++i) { // 修改处&&&&&&&&XOModel *model = [XOModel alloc]; // 注意这句只有alloc&&&&&&&&[self.array addObject:model];&&&&}}
我们可以借助runtime来查看一个类对象所需要的内存大小。值得一提的是我最开始用的方法是class_getInstanceSize,原型如下:
Objective-C
* Returns the size of instances of a class.
* @param cls A class object.
* @return The size in bytes of instances of the class \e cls, or \c 0 if \e cls is \c Nil.
OBJC_EXPORT size_t class_getInstanceSize(Class cls)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
* Returns the size of instances of a class. *
* @param cls A class object. *
* @return The size in bytes of instances of the class \e cls, or \c 0 if \e cls is \c Nil. */OBJC_EXPORT size_t class_getInstanceSize(Class cls) &&&& __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
貌似是我们需要的函数,但是我发现这个方法有bug,返回的size和instruments的值不同,后来又发现有人遇到同样的,所以了另一种方法,代码如下:
Objective-C
#import &objc/runtime.h&
#import &malloc/malloc.h&
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
XOModel *model = [XOModel alloc];
[self.array addObject:model];
NSLog(@"Size of %&a href="http://www.jobbole.com/members/q"&@:&/a& %zd", NSStringFromClass([XOModel class]), malloc_size((__bridge const void *) model));
#import &objc/runtime.h&#import &malloc/malloc.h&...- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {&&&&XOModel *model = [XOModel alloc];&&&&[self.array addObject:model];&&&&&&&&NSLog(@"Size of %&a href="http://www.jobbole.com/members/q"&@:&/a& %zd", NSStringFromClass([XOModel class]), malloc_size((__bridge const void *) model));}
再贴下XOModel代码:
Objective-C
#import &Foundation/Foundation.h&
@interface XOModel : NSObject
NSString *a2;
#import &Foundation/Foundation.h&&@interface XOModel : NSObject{&&&&int a1;&&&&NSString *a2;}&@end
在iPhone 6(或其他64位)的机子上运行,输出如下:
Objective-C
AllocTest[8] Size of XOModel: 32
AllocTest[38470:2551068] Size of XOModel: 32
“啊咧,我一个int,一个指针你分给我32个字节,操作系统你是脑子进屎了吗?”
我们再修改一下XOModel代码,不要实例变量:
Objective-C
#import &Foundation/Foundation.h&
@interface XOModel : NSObject
#import &Foundation/Foundation.h&&@interface XOModel : NSObject{}&@end
输出如下:
Objective-C
AllocTest[2] Size of XOModel: 16
AllocTest[38630:2562602] Size of XOModel: 16
“我靠,我什么东西都没有,操作系统你还要分给我16个字节,是不是傻?”
智慧的操作系统这样做当然是有它自己的原因滴,这里我们需要知道三个东西:
任何类对象都有一个isa指针,需要分配内存。
32位机子上指针大小为4字节,64位机子为8字节。
字节对齐。
第一点就不说了,不知道的话您多半也没耐心看到现在了。
第二点贴个文档图,iOS7过后部分苹果机就开始从32位操作系统转到64位了,所以部分数据类型的大小也有变化,这里我们主要关注例子中的指针:
现在,基于这两点对样例分析。
第一个样例(类对象中一个int,一个NSString指针,一个isa指针),64位操作系统上应该是4+8+8=20,然而输出是32,不对。
第二个样例(类对象中只有一个isa指针),64位操作系统上应该是8,然而输出是16,还是不对。why?
字节对齐我了解得也不是太多,简单点讲目的就是为了提高存取效率,概念就不展开了,可以看,我这里就直接讲原理了。先贴一份苹果的:
When allocating any small blocks of memory, remember that the granularity for blocks allocated by the malloc library is 16 bytes. Thus, the smallest block of memory you can allocate is 16 bytes and any blocks larger than that are a multiple of 16. For example, if you call malloc and ask for 4 bytes, it returns a block whose size is 16 if you request 24 bytes, it returns a block whose size is 32 bytes. Because of this granularity, you should design your data structures carefully and try to make them multiples of 16 bytes whenever possible.
有点长,简单的意思就是:
当我们分配一块内存的时候,假设需要的内存小于16个字节,操作系统会直接分配16个字节;加入需要的内存大于16个字节,操作系统会分配a*16个字节。举个栗子,如果你调用malloc并且需要4个字节,系统会给你一块16个字节的内存块;如果你调用malloc并且需要24个字节,系统会给你一块32个字节的内存块。
现在再看我们的栗子,就可以直接上图了:
第一个例子不对齐应该是20字节,对齐就是32字节。
第二个例子不对其应该是8字节,对齐就是16字节:
ps:在32位机器上可能会有不一样的结果,因为指针大小不同,但是32位的苹果机也是16字节对齐的。
至此我们对alloc的探究就结束了。
这次的探究算是比较彻底了,过程当中也学到了很多东西,在这个浮躁的社会,学贵在道,术次之,打好基础、保持思考才不会磨灭掉你对它最初的兴趣。
参考链接:
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
比较接地气
o 104 回复
关于iOS频道
iOS频道分享iOS和Swift开发,应用设计和推广,iOS相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线

我要回帖

更多关于 主线为什么有颜色 的文章

 

随机推荐