今天面试iOS被四个问题难到了。。

第一个问题:如果你的项目中有很多个类,都需要归档和解档,你该怎么办。。

第二个问题:如何给NSArray NSNumber 这些类簇的前端类增加一个属性

第三个问题:写项目的时候,一般服务器的接口,或者一些经常用到得字符串,他问我应该放在哪里,我说放在预编译文件里面,他说不好。。说应该放在外部文件中,然后用extern。这个我不太明白。

第四个问题:你用过真机测试吧,给我概述一下数据签名

于是,今天下去之后上网搜了一下资料,决定把着四个问题解决掉

  1. 先说第一个问题。第一个问题,我想到的就是给需要归档和解档的类设置一个父类,在父类里面实现NSCoding的协议,可是每个子类的属性都不一样,,那该怎么办呢??在网上查了一下,看到一篇自动归档和解档的文章,于是就试着文章上的代码敲了一下果然成了。在父类里面实现如下代码即可,用的是运行时概念
  (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        Class c = self.class;
        //截取类和父类的成员变量
        while (c&&c!=[NSObject class]) {
            unsigned int count = 0;
            Ivar *ivars = class_copyIvarList(c, &count);
            for (int i = 0; i<count; i++) {
                NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
                id value = [aDecoder decodeObjectForKey:key];
                [self setValue:value forKey:key];
            }
            //获得c的父类
            c = [c superclass];
            free(ivars);
        }
    }
    return self;
}

  (void)encodeWithCoder:(NSCoder *)aCoder {
    Class c = self.class;
    while (c && c!=[NSObject class]) {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList(c, &count);
        for (int i = 0;  i< count ; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
            id value = [self valueForKey:key];
            [aCoder encodeObject:value forKey:key];
        }
        c = [c superclass];
        free(ivars);
    }
}

其实这段代码,我还是不太懂什么意思,后续在努力研究研究把。。
2. 第二个问也是要用到运行时,我只能说我对运行时了解的太少了。。。
在网上查了之后,发现iOS中有一种能动态添加属性的方法:关联

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。
在类的定义之外为类增加额外的存储空间
使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。
创建关联
创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
■ 关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
■ 关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的
下面举一个给NSArray 增加一个name属性的例子:

#import <Foundation/Foundation.h>

@interface NSArray (Associate)

@property (nonatomic,copy) NSString *name;

@end
#import "NSArray+Associate.h"

#import <objc/runtime.h>

@implementation NSArray (Associate)
@dynamic name;
static char nameKey;

- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, &nameKey);
}

@end

这个还比较好理解,学习了之后就豁然开朗了。

  1. 第三个问题我实在体会不到,就先不写了
  2. 第四个问题,明天再研究吧。。。
展开阅读全文

没有更多推荐了,返回首页