小工具知识网

当前位置: 首页 > 行业知识 > IOS面试题object-c 11-20

行业知识

IOS面试题object-c 11-20

2026-11-12 08:43:09 来源:互联网转载
11、解释self = [super init]方法?

容错处���, 当父类初始化失败,会返回一个nil, 表示初始化失败。

()

由于继承的关系, 子类是需要拥有父类的实例和行为, 因此, 我们必须先初始化父类,然后再初始化子类

12、简述使用block有什么优点?
代码紧凑,传值、回调都很方便,省去了写代理的很多代码。

NSTimer封装成的block,具体实现实现方法:

()

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0

        repeats:YES

        callback:^() {

                weakSelf.secondsLabel.text = ...

        }

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

13、 Object-C中是否有二维数组,如何实现二维数组?

在实际的项目开发中,二维数组也是常常用到的数据结构。

OC中的二维数组也是通过一维数组来建立的,今天我们来详解一下如何在OC中使用二维数组。

使用NSArray初始化的一维数组和二维数组都是不可变数组。

#import

int main(int argc, const char * argv[]) {

        @autoreleasepool {

        //定义2个一维数组;

        NSArray *firstRow = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];

        NSArray *secondRow = [[NSArray alloc] initWithObjects:@"4",@"5",@"6", nil];

        //使用一维数组来初始化二维数组;

        NSArray *my2DArray = [[NSArray alloc] initWithObjects:firstRow,secondRow, nil];

        //输出二维数组对象;

        NSLog(@"二维数组:%@",my2DArray);

        //遍历二维数组;

        for (int i = 0; i

                        for (int j = 0; j

                                NSLog(@"二维数组元素:%@",[[my2DArray objectAtIndex:i] objectAtIndex :j]);

                        }

                }

        }

        return 0;

}

14、简述property属性的修饰符的作用?
getter=getName、setter=setName:设置setter与getter的方法名;
readwrite、readonly:设置可供访问级别;
assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题;
retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序;

copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。

这是为了减少对上下文的依赖而引入的机制。

nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。

注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问

15、 将字符串“2015-04-10”格式化日期转为NSDate类型

NSString *timeStr = @"2015-04-10";

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

                if (!isCanceled) {

                        block();

                }

        });

        return cb;

}

在本例中,如果 block 执行中的代码是通过参数传递进来的话,似乎并没有什么办法可以修改它了

19、简述IOS __block和__weak修饰符的区别?
1、__weak:

__weak只能在ARC下使用,且只能修饰对象,不能修饰基本数据类型(int等),弱引用,可以block解决循环引用问题。

2、__block:

__block既能再ARC下使用,也能在 MRC下使用。既能修饰对象又能修饰基本数据类型。

ARC、MRC区别:__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用。
ARC、MRC共同点:block内对于栈上的数据不能修改,使用__block修饰以后放到了堆上就可以修改了。
20、解释单例的写法在单例中使用数组要注意什么?
static PGSingleton *sharedSingleton;

+ (instancetype)sharedSingleton

{

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

                sharedSingleton = [[PGSingleton alloc] init];

        });

        return sharedSingleton;

}

其实上面的还不是标准的单例方法,标准的单例方法需要重写 copyWithZone,allocWithZone,init,确保以任何方式创建出来的对象只有一个,这里就不详细写了。

单例使用 NSMutableArray 的时候,防止多个地方对它同时遍历和修改的话,需要加原子属性。

并且property用strong,并且写一个遍历和修改的方法。

加上锁. Lock,UnLock.(PS:考虑性能问题尽量避免使用锁,在苹果的文档张看到的不要问我为什么,我也忘了自己查去。。)

上一篇:测试下载速度的方法与技巧

下一篇:轻松下载JPEG格式图片的方法指南