iOS 面试题 总结
#include <iostream>
using namespace std;
int main ()
{
char p[]={'a','b','c'}, q[]="abc";
printf("%d %d\n",sizeof(p),sizeof(q));
//getch();
} //结果 3,4
sizeof有什么作用呢?
sizeof是C语言的关键字不并不是函数,这个很容易被忽略
sizeof(a)表示a在内存中所占的字节数
以下是windows NT下得32位c++程序,请计算sizeof的值
void Func(char str[100])
{
sizeof(str)=?
}
void *p=malloc(100);
sizeof(p)=?
答案:都是4个字节
但是我去面试的时候,下意思的就写成了100;
我们来分析一下:
Func(char str[100])函数中数组名作为函数形参的时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针; 在失去内涵的同时,他还失去了常用的特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4个字节,故sizeof(str)、sizeof(p)都为4
如果是在64位下,内存是8位; 32位系统下是4位
二、Cocoa Core Competencies 的Object creation 和 IOS面试题示例:写一个NSString类的实现
建立对象需要2个步骤 1分配内存,2初始化内存
1分配内存,要sent  alloc  or allocWithZone:  message to the object’s class. 也就是常见的[Class alloc].或是不常见的[Class allocWithZone]
2初始化.要调用init的方法进行初始化,各种各样的要或不要参数的init方法都算.
以上建立对象的方式,返回值要送进 对象自动管理池
IOS面试题示例: 写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
The Form of an Object-Creation Expression
A convention in Cocoa programming is to nest the allocation call inside the initialization call.
MyCustomClass *myObject = [[MyCustomClass alloc] init];
便利函数:就是工厂方法,不需使用者管理.
+ (id)dataWithContentsOfURL:(NSURL *)url;
iOS应用开发:什么是ARC?
ARC是iOS 5推出的新功能,全称叫ARC(Automic Reference Counting).简单的说,就是代码中自动加入了retain/release,原来需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
简单的理解ARC,就是通过制定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,他只是一种代码静态分析(Static Analyzer)工具。
ARC使用前后的变化,我们通过代码来实现
    @interface NonARCObject : NSObject {
        NSString *name;
    }
    -(id)initWithName:(NSString *)name;
    @end  
    @implementation NonARCObject
    -(id)initWithName:(NSString *)newName {
        self = [super init];
        if (self) {
            name = [newName retain];
        }
        return self;
    }  
    -(void)dealloc {
        [name release];
        [Super dealloc];
    }
    @end  
    @interface ARCObject : NSObject {
        NSString *name;
    }
    -(id)initWithName:(NSString *)name;
    @end  
    @implementation ARCObject
    -(id)initWithName:(NSString *)newName {
        self = [super init];
        if (self) {
            name = newName;
        }
        return self;
    }
    @end  
- 生成对象时,使用autorelease
 - 对象代入时,先autorelease后再retain
 - 对象在函数中返回时,使用return [[object retain] autorelease];
 
而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。
使用ARC的好处?
使用ARC有什么好处呢?
- 看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了
 - 代码的总量变少了,看上去清爽了不少,也节省了劳动力
 - 代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性
 
ARC不好的地方?
- 记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期
 - 一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关
 
关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。
这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。

如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。

ARC 的基本规则?
- retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
 - dealloc虽然可以被重载,但是不能调用[super dealloc]
 
由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。
Objective-C对象
ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。
- 只要对象的持有者存在(对象被强参照),那么就可以使用该对象
 - 对象失去了持有者后,即被破弃
 
什么是强参照 (Strong reference)?

(s1)
firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。
- (s2)
 
这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。
- (s3)
 
这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。
- (s4)
 
追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。
- (s5)
 
将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。
什么是弱参照 (Weak reference)?
接下来我们来看看弱参照 (Weak reference) 的使用方式。

(w1)
与强参照方式同样,firstName作为字符串对象@”natsu”的持有者存在。即是该NSString类型对象的Strong reference。
- (w2)
 
使用关键字__weak,声明弱参照weakName变量,将firstName代入。这时weakName虽然参照@”natsu”,但仍是Weak reference。即weakName虽然能看到@”natsu”,但不是其持有者。
- (w3)
 
firstName指向了新的对象@”maki”,成为其持有者,而对象@”natsu”因为没有了持有者,即被破弃。同时weakName变量将被自动代入nil。
引用关键字
ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。
- __strong
 
变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。
- __weak
 
上面已经看到了,这是弱参照的关键字。该概念是新特性,从 iOS 5/ Mac OS X 10.7 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。
NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
NSLog(@"string: %@", string); //此时 string为空
如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。
弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。
- __unsafe_unretained
 
该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。
- __autoreleasing
 
该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。
    - (void) generateErrorInVariable:(__autoreleasing NSError **)paramError {
        ....
        *paramError = [[NSError alloc] initWithDomain:@"MyApp" code: userInfo:errorDictionary];
    }  
    ....
    {
        NSError *error = nil;
        [self generateErrorInVariable:&error];
        NSLog(@"Error = %@", error);
    }  
又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。
-(NSString *)stringTest
{
NSString *retStr = [NSString stringWithString:@"test"]; return [[retStr retain] autorelease];
} // 使用ARC -(NSString *)stringTest
{
__autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"]; return retStr;
}
即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。
总结
- 今天,我们看到了基本的ARC使用规则
 
- 代码中不能使用retain, release, retain, autorelease
 - 不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])
 - 不能使用NSAllocateObject, NSDeallocateObject
 - 不能在C结构体中使用对象指针
 - id与void *间的如果cast时需要用特定的方法(__bridge关键字)
 - 不能使用NSAutoReleasePool、而需要@autoreleasepool块
 - 不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)
 
原文地址:http://www.yifeiyang.net/development-of-the-iphone-simply-1/
iOS 面试题 总结的更多相关文章
- 最全的iOS面试题及答案-转载
		
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...
 - IOS面试题总结
		
iOS面试题: 一:网络理论知识的理解 1:Internet物理地址和IP地址转换采用什么协议 ARP(Address Resolution Protocol)地址解析协议 2:Internet采用哪 ...
 - iOS面试题及答案2015.6.7
		
iOS面试题及答案 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承 ...
 - [转载]iOS面试题总
		
转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载 crash 原文 ...
 - 试答卓同学的 iOS 面试题
		
卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...
 - iOS面试题大全-点亮你iOS技能树
		
所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...
 - 原 iOS面试题收集
		
原 iOS面试题收集 发表于2年前(2013-07-22 13:47) 阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...
 - ios 面试题 经典(比较全) 根据重点总结
		
史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...
 - YouKu iOS笔试题一
		
序言 最近收到某某同学将去youku的iOS笔试题的邮件,希望笔者能整理一下,并提供参考答案.笔者决定整理出来,并分享给大家.当然,与此同时,也想看看youku的笔试题到底有多难,也考考自己有多少料吧 ...
 
随机推荐
- svn 分支
			
网上的SVN分支的教程真的不好用,我这里自己写的,绝对靠谱: SVN的分支跟GIT的分支不一样,SVN的分支,包括文件夹的分支或者是文件的分支,都是重复复制文件的,步骤如下: 1.branch/tag ...
 - Linux常用命令记录
			
产用Linux命令 cat /proc/partitions //查看系统分区情况 fdisk -l /dev/sdb //查看磁盘物理存储 mount /dev/目录 /mnt/目录 //挂载文件 ...
 - linq简介
			
语言集成查询(Language INtegrated Query,LINQ)是一项微软技术,新增一种自然查询的SQL语法到.NET Framework的编程语言中,可支持Visual Basic .N ...
 - 黄聪:如何阻止iframe里引用的网页自动跳转
			
今天做了个网页,要在网页里设置一个iframe,然后套用其他的网站.使用http://luanqi-cat.blogbus.com 这个网址的时候,出现了莫名其妙的问题,我的网页居然会强制自动跳转到这 ...
 - VS 开发工具中的Remote Debug 功能远程调试程序经验分享
			
前言: 有时候我们Dev(开发人员)需要debug tester(测试人员)或者customer(客户)的环境,可tester的机器上没有Code,是不是有点着急? 而且是多版本应用且tester 发 ...
 - UDP程序设计
			
UDP是不可靠的连接,广泛应用于各种聊天工具 使用UDP发送的信息,对方不一定会接收到.所有的信息使用数据报的形式发送出去,这就要求客户端要始终等待服务器发送的信息才能进行接收.在Ja ...
 - xhprof 安装使用
			
1.安装扩展 windows下把 xhprof.dll 放到extensions目录下 修改配置文件 [xhprof] extension=xhprof.so; ; directory used by ...
 - Apache2 添加登陆用户名和密码
			
1. 修改httpd.conf, 对要做认证的目录进行设置<Directory "/usr/local/var/www"> Options Indexes Foll ...
 - 关于Switch结构利用
			
三大流程结构,循环.分支.if ,循环与条件选择结构用的比较多,而swicth用的比较少,swicth可以用if代替,只不过麻烦,最终都能实现输入和输出的条件对应 Swicth利用 ...
 - python 最长公共子序列
			
网上有很多,但有bug,特别是这个:http://www.oschina.net/code/snippet_16840_2015 好大的坑... get length def lcs_len(a,b) ...