面试题
1、如何通过UIView获取当前的UIViewController
2、说一说 iOS内存管理机制
3、运行以下代码,输出什么?为什么会出现这样的结果?
截屏2020-12-03 20.44.28.png
@interface NSObject (Test)
+ (void)run;
@end
@implementation NSObject (Test)
- (void)run {
NSLog(@"加油");
}
@end
运行 [NSObject run];
输出:加油
截屏2020-12-03 20.46.08.png
4、运行以下代码,输出什么?为什么会出现这样的结果?
在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值
void test(){
int a = 10;
void (^block)(void) = ^{
NSLog(@"a is %d", a);
};
a = 20;
block();
}
运行test();
// 调用后控制台输出"a的值为:10"
Block内访问__block修饰的局部变量
在局部变量前使用__block修饰,在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之后的新值
__block int a = 10;
void(^myBlock)(void) = ^{
NSLog(@"a的值==%d",a);
};
a = 11;
// 调用后控制台输出"a的值== 11"
myBlock();
5、运行以下代码,输出什么?为什么会出现这样的结果?
// 当前是主线程
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);// 串行队列
// 异步
dispatch_async(queue, ^{
NSLog(@"test1");
// 同步
dispatch_sync(queue, ^{
NSLog(@"test2");
});
});
截屏2020-12-03 21.04.02.png
【程序崩溃!!!】
输出结果:Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
【这表明您正在后台线程上做一些工作,并以某种方式修改UI而不分配给主线程】
6、给定一个排序数组,删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。(注意要求:不使用额外的数组空间,并且在时间复杂度为O(1) 下完成)
比方说:int test[] = {1,2,2,3,3,4,4,4,5,6,6};
(思路):
采用双指针法,初始时 i=0,j=1,然后移动 j ,判断nums[i] == nums[j] ,如果 nums[i] 不等于 nums[j] 则把 nums[j] 的值赋给 i 的的下一位,然后 i 自增1(此处注意 i++ 和 ++i 的区别)。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i=0;
int n = nums.size();
if(n==0) return 0;
for(int j=1;j<n;j++){
if(nums[i] != nums[j]) nums[++i] = nums[j];
}
return i+1;
}
};
力扣提交结果:
执行用时 : 32 ms, 在Remove Duplicates from Sorted Array的C++提交中击败了96.08% 的用户
内存消耗 : 9.8 MB, 在Remove Duplicates from Sorted Array的C++提交中击败了87.58% 的用户
(第二种方法):
public int removeDuplicates(int[] nums) {
//创建一个空集合
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
//如果集合不包含数组的某个元素,就把该元素添加到集合中。集合中包含的元素则不添加
if(!list.contains(nums[i])){
list.add(nums[i]);
}
}
int num =list.size();
return num;
}