OC面试CheckList

@property中有哪些属性关键字?

@property和@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法(getter和setter)。在Xcode4.5以及以后的版本中,@synthesize可以省略。

  1. atomic与nonatomic
    atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步的问题,提供多线程安全。
    nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,禁止多线程,变量保护,提高性能和效率。
    注:
    atomic是Objc使用的一种线程保护技术,基本上来讲是防止在写未完成的时候另一个线程读取,造成的数据错误。而这种机制是非常耗费系统资源的,所以iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。而iOS开发中,普遍使用nonatomic也是基于性能这一点。

  2. readwrite与readonly
    readwrite:这个属性是默认的情况,会自动为你生成存取器。
    readonly:只生成getter,不会生成setter方法。
    注:
    readwrite、readonly这两个属性的真正价值,不是提供成员变量的访问接口,而是控制成员变量的访问权限。

  3. strong与weak
    strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡,当强引用指向了某个对象,那便拥有了这个对象。如果不存在指向一个对象的引用,并且此对象不再使用,则对象就会被从内存中释放掉。默认所有实例变量和局部变量都是strong指针。
    weak:弱引用,不决定对象的存亡,只是单纯的引用了某个对象但是并不拥有该对象。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。
    注:
    strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针置为nil,避免了野指针的产生,因而weak属性就不需要在dealloc中置nil了。

  4. assign、copy、retain
    assgin:默认类型,setter方法直接赋值,不进行任何的retain操作,不改变引用计数。一般用来处理基本数据类型。
    retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。可理解为指针拷贝。
    copy:与retain的流程一样,先对旧的值release,再copy出新的对象,引用计数为1,为了减少对上下文的依赖而引入的机制。可以理解为内容的拷贝,也就意味着内容被copy后,内存中会有两个存储空间存储同样的内容。
    注:
    使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
    使用copy: 对NSString
    使用retain: 对其他NSObject和其子类


@synthesize和@dynamic分别有什么作用?

简单来讲,通过@synthesize指令告诉编译器在编译期间产生getter和setter方法。如果自定义getter和setter方法则会覆盖编译器帮我们生成的方法。
@dynamic指令告诉编译器在编译期间不自动生成getter和setter方法,避免编译期间产生警告。然后由自己实现存取方法或存取方法在运行时动态创建绑定。其主要作用就是用在NSManageObject对象的属性声明中,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和setter方法。


ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

atomic,readwrite,strong(对象),assgin(基本数据类型)。


用@property声明的NSString、NSArray、NSDictionary经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

这个问题无非就是考察你对copy、strong这个两个修饰符的理解。简单来讲,strong是强引用,仍旧指向同一个内存地址;copy是内容拷贝,会另外开辟一个内存空间来存储被拷贝的内容,指针指向了一个不同的内存地址。注意,copy返回的是一个不可变对象。如果用strong修饰可变对象,那么这个对象就会有可能在不经意间被修改,有时候这并不是我们的想要看到的,而用copy便不会有这种意外发生了。


@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?

@synthesize表示由编译器来自动实现属性的getter/setter方法,不需要你自己再手动去实现。默认情况下,不需要指定实例变量的名称,编译器会自动生成一个属性名前加“_”的实例变量。当然也可以在实现代码里通过@synthesize语法来指定实例变量的名字。比如@synthesize foo = oof(oof为你想要定义的名称)。
如果property名为foo并且存在一个名为_foo的实例变量,编译器便不会为我们自动合成新变量了。下面有一段代码大家可以试一下帮助更好的理解。

@interface ViewController : UIViewController
@property (copy, nonatomic) NSString *testA;
@property (copy, nonatomic) NSString *testB;
@end

@interface ViewController ()
{
    NSString *_testA;
    NSString *_testB;
}
@end

@implementation ViewController

@synthesize testB = testBBBBB;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.testA = @"1111";
    self.testB = @"1111";
    //输出结果为:self.testA = 1111,_testA = 1111,self.testB = 1111,testBBBBB = 1111,_testB = (null)
    NSLog(@"self.testA = %@,_testA = %@,self.testB = %@,testBBBBB = %@,_testB = %@",self.testA,_testA,self.testB,testBBBBB,_testB);
    
    _testA = @"2222222";
    _testB = @"2222222";
    //输出结果为:self.testA = 2222222,_testA = 2222222,self.testB = 1111,_testB = 2222222,testBBBBB = 1111
    NSLog(@"self.testA = %@,_testA = %@,self.testB = %@,_testB = %@,testBBBBB = %@",self.testA,_testA,self.testB,_testB,testBBBBB);
    
    testBBBBB = @"333333";
    //输出结果:self.testB = 333333,testBBBBB = 333333,_testB =2222222
    NSLog(@"self.testB = %@,testBBBBB = %@,_testB =%@",self.testB,testBBBBB,_testB);
}

可加群一起交流共同学习:801216530。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,245评论 0 33
  • 摘自: http://www.cocoachina.com/ios/20150803/12872.html 说明...
    program袁阅读 872评论 1 3
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,711评论 0 4
  • 经我多次智商测试鉴定,大爷的智商相当于三岁小孩水平,翠花儿相当于得了唐氏综合症的三岁小孩水平。(坏笑)。来看看大爷...
    Echo来啦阅读 304评论 0 0
  • 路旁盛开红几树 云样无华 月样无华 行人驻足笑问答 烈日炎炎何惧暑 风也由它 雨也由它 秀雅娇柔紫薇花
    璃嫣阅读 487评论 5 5