溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

長(zhǎng)沙戴維營(yíng)教育iOS開(kāi)發(fā)面試題周刊

發(fā)布時(shí)間:2020-09-30 13:56:20 來(lái)源:網(wǎng)絡(luò) 閱讀:229 作者:wcrane 欄目:移動(dòng)開(kāi)發(fā)

[TOC]

1. 介紹一下assign, copy與retain的區(qū)別。
  • assign 簡(jiǎn)單的指針賦值,不涉及引用計(jì)數(shù)的操作。

  • copy 產(chǎn)生一個(gè)新對(duì)象,引用計(jì)數(shù)為1,老對(duì)象引用計(jì)數(shù)不變。

  • retain 對(duì)象的引用計(jì)數(shù)加1。

  • weak 自動(dòng)引用計(jì)數(shù)環(huán)境下使用,與assign類(lèi)似,但是當(dāng)對(duì)象釋放后會(huì)自動(dòng)置為nil。

  • strong 自動(dòng)引用計(jì)數(shù)環(huán)境下使用,類(lèi)似于retain,強(qiáng)引用的對(duì)象不會(huì)被釋放。

2. center、frame與bounds的關(guān)系是什么?

center和frame是指視圖在父視圖的坐標(biāo)系統(tǒng)中的表示,center表示UIView的中心點(diǎn)在父視圖坐標(biāo)系統(tǒng)中的位置,frame表示UIView在父視圖坐標(biāo)系統(tǒng)中的位置和大小。bounds表示視圖在它本身的坐標(biāo)系統(tǒng)中的位置。如果修改bounds的origin會(huì)導(dǎo)致該視圖的子視圖位置發(fā)生改變,但不會(huì)影響視圖本身的位置。一般來(lái)說(shuō),frame是由center和bounds計(jì)算得來(lái)?;蛘呤钦f(shuō)UIView的frame由它所擁有的CALayer的position、anchorPoint和bounds決定。 長(zhǎng)沙戴維營(yíng)教育iOS開(kāi)發(fā)面試題周刊

3. 執(zhí)行下面的代碼會(huì)發(fā)生什么現(xiàn)象?
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

給對(duì)象發(fā)送一次autorelease消息就會(huì)將它在自動(dòng)釋放池中注冊(cè)一次。當(dāng)自動(dòng)釋放池release或者drain的時(shí)候,將給注冊(cè)到里面的對(duì)象按注冊(cè)的次數(shù)發(fā)送release消息。因此最后ball對(duì)象會(huì)接收到兩次release消息,由于ball的引用計(jì)數(shù)為1,當(dāng)接收第一次release后就被釋放了。第二次release的時(shí)候會(huì)導(dǎo)致程序崩潰。

4. 什么是KVC,如何使用?

KVC是由NSKeyValueCoding非正式協(xié)議所實(shí)現(xiàn)的一種機(jī)制,使得應(yīng)用程序可以通過(guò)名字或Key來(lái)訪問(wèn)對(duì)象的屬性,而不是直接調(diào)用訪問(wèn)器或者實(shí)例變量。 示例代碼:

//  Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//

#import 

@class DVIDog;

@interface DVIStudent : NSObject
{
@public
   NSString *_name;
@protected
   NSString *_studentID;
@private
   float _height;
}
//_age
@property (nonatomic, assignint age;
@property (nonatomic, strongDVIDog *dog;
@property (nonatomic, strongNSMutableArray *dogsArray;

- (void)printInfo;

- (void)setValueFromDict:(NSDictionary *)dict;
@end

類(lèi)的實(shí)現(xiàn):

//
//  DVIStudent.m
//  KVCSample
//
//  Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//

#import "DVIStudent.h"

#import "DVIDog.h"

@implementation DVIStudent

- (id)init
{
   if (self = [super init]) {
       _dogsArray = [NSMutableArray array];
   }

   return self;
}

@synthesize age = _age;

- (void)printInfo
{
   NSLog(@"%@:%@:%d:%f", _name, _studentID, _age, _height);
}

- (void)setValueFromDict:(NSDictionary *)dict
{
   _name = [dict objectForKey:@"name"];
   _age = [[dict objectForKey:@"age"] intValue];
   _height = [[dict objectForKey:@"height"] floatValue];
   _studentID = [dict objectForKey:@"studentID"];
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
   NSLog(@"%@:%@", key, value);
}

- (void)setNilValueForKey:(NSString *)key
{
   NSLog(@"%@", key);
}

- (void)setAge:(int)age
{
   NSLog(@"age: %d", age);
   _age = age;

   _height += 0.1;
}

- (int)age
{
   return _age;
}
@end

第二個(gè)類(lèi):

//  Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//

#import 

@interface DVIDog : NSObject

@property (nonatomic, assignint weight;

@end

第二個(gè)類(lèi)的實(shí)現(xiàn):

//  Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//

#import "DVIDog.h"

@implementation DVIDog

@end

使用KVC訪問(wèn)屬性:

_student = [[DVIStudent alloc] init];
//    student.age = 20;
[_student setValue:@20 forKey:@"age"];

_student->_name = @"Zhangsan";
//1. _key
//2. key
[_student setValue:@"1001" forKey:@"studentID"];
[_student setValue:@1.7 forKey:@"height"];

[_student printInfo];

NSLog(@"%@", [_student valueForKey:@"age"]);

NSDictionary *dict = @{@"name":@"Lisi",@"studentID":@"2002",@"age":@33,@"height":@1.8};
[_student setValueFromDict:dict];
[_student printInfo];

dict = @{@"name":@"Wangwu",@"studentID":@"3002",@"age":@23,@"height":@0.8};
[_student setValuesForKeysWithDictionary:dict];
[_student printInfo];

DVIDog *dog = [[DVIDog alloc] init];
_student.dog = dog;

_student.dog.weight = 20;
[_student setValue:@30 forKeyPath:@"dog.weight"];
NSLog(@"%@", [_student valueForKeyPath:@"dog.weight"]);

[_student setValue:@12 forKey:@"weight"];
[_student setNilValueForKey:@"age"];

NSLog(@"%@", [_student valueForKey:@"age"]);

KVC中除了訪問(wèn)單個(gè)屬性外,還能夠?qū)蠈傩赃M(jìn)行訪問(wèn)和操作:

for (int i = 0i <</span> 100++i{
   DVIDog *dog = [[DVIDog alloc] init];
   dog.weight = i;
   [_student.dogsArray addObject:dog];
}

//
NSLog(@"%@", [_student valueForKeyPath:@"dogsArray.@count"]);

常用的集合操作:

bash @avg, @max, @min, @count, @sum等 

在KVC的基礎(chǔ)上,蘋(píng)果提供了KVO來(lái)獲取屬性改變的事件: 添加KVO觀察者:

[_student addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld |NSKeyValueObservingOptionPrior context:nil];

觀察者獲取通知:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
   NSLog(@"%@: %@: %@", keyPath, object, change);
   _nameLabel.text = [change objectForKey: NSKeyValueChangeNewKey];

}
5. 舉例說(shuō)明幾個(gè)常用的Xcode環(huán)境變量。
  • $(BUILT_PRODUCTS_DIR) 構(gòu)建成功后,目標(biāo)文件存放的位置。

  • $(TARGET_NAME) 目標(biāo)工程名。

  • $(SRCROOT) 工程文件存放的位置。

  • $(CURRENT_PROJECT_VERSION) 當(dāng)前工程版本號(hào)。

6. 需要對(duì)一個(gè)代理對(duì)象進(jìn)行強(qiáng)引用(retain)嗎?

不應(yīng)該對(duì)一個(gè)對(duì)象進(jìn)行強(qiáng)引用。代理對(duì)象可能對(duì)被代理對(duì)象擁有強(qiáng)引用,如UITableViewController對(duì)它里面的tableView的引用。如果tableView的代理也是強(qiáng)引用的話,就會(huì)導(dǎo)致因?yàn)檠h(huán)引用而出現(xiàn)內(nèi)存泄漏。

7. 描述一下UIButton類(lèi)的繼承關(guān)系,直到NSObject。

NSObject <- UIResponder <- UIView <- UIControl <- UIButton

8. 什么是@dynamic?

@synthesize 編譯器自動(dòng)生成setter和getter。 @dynamic 需要手工實(shí)現(xiàn)setter和getter,并且不能在后面用=號(hào)標(biāo)明對(duì)應(yīng)的實(shí)例變量。 @compatibility_alias 給類(lèi)起別名。

@compatibility_alias DVINewStudent DVIStudent;

@encode 獲取類(lèi)型的字符串,可以用來(lái)判斷類(lèi)型。

@encode(int) //i
@encode(CGRect) //{CGRect={CGPoint=ff}{CGSize=ff}}
@encode(DVIStudent) //{DVIStudent=#}
9. 給一個(gè)對(duì)象發(fā)送performSelector:withObject:afterDelay:消息后,會(huì)給對(duì)對(duì)象進(jìn)行retain嗎?

給對(duì)象發(fā)送延時(shí)執(zhí)行的消息會(huì)對(duì)對(duì)象進(jìn)行retain操作,并且在方法執(zhí)行完后進(jìn)行release操作。

10. NSCoder類(lèi)的用途是什么?

NSCoder是一個(gè)抽象的基類(lèi),為子類(lèi)定義了在對(duì)象和其它Objective-C數(shù)據(jù)在內(nèi)存和其它格式直接進(jìn)行轉(zhuǎn)換的能力,是歸檔(將對(duì)象和數(shù)據(jù)存放到磁盤(pán))和分發(fā)(在進(jìn)程和線程直接進(jìn)行數(shù)據(jù)傳遞)的基礎(chǔ)。在基礎(chǔ)框架(Foundation)中提供了NSKeyedArchiver、NSKeyedUnArchiver等子類(lèi)。NSCoder可以操作對(duì)象、標(biāo)量、C語(yǔ)言數(shù)組、結(jié)構(gòu)體、字符串等,但是不支持聯(lián)合體、void指針、函數(shù)指針等與平臺(tái)實(shí)現(xiàn)相關(guān)的數(shù)據(jù)類(lèi)型。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI