这个需要掌握,入学题不是有吗,面试有可能就是你做过的题。写最简单的一个单例就行了
8、 写一个Person类,要保证无论什么情况下创建Person对象返回的都是同一个对象(单例设计模式)。(Objective-C)
*/
/*
编程思想:
用不同方法创建对象要想返回的都是同一个对象必须使用static创建静态对象,将static写在Person类的方法中,使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWithZone 的方法。于是覆盖allocWithZone方法的原因已经很明显了:为了保持单例类实例的唯一性,需要覆盖所有会生成新的实例的方法,于是就必须重写allocWithZone方法,满足需求。最后测试用两种方法创建几个对象,输出他们的内存地址观察是否一样
*/
#import <Foundation/Foundation.h>
#import "Person.h"
//1.在main函数里面进行简单的测试
int main()
{
//2.创建一个Person对象
Person *p1 = [Person sharePerson];
//3.用同样的方法创建另一个Person对象
Person *p2 = [Person sharePerson];
//4.适用alloc创建一个Person对象
Person *p3 = [[Person alloc]init];
//5.将三者的地址返回进行对比
NSLog(@"\n%@\n%@\n%@",p1,p2,p3);
//6.程序正常退出
return 0;
}
@interface Person : NSObject
//覆盖allocWithZone方法的声明
+ (id)allocWithZone:(NSZone *)zone; // 此方法可以不在此声明,在实现中重写亦没有错误
//sharePerson方法的声明
+ (Person *) sharePerson;
@end
@implementation Person
//sharePerson方法的实现
+(Person *)sharePerson
{
//1.静态的Person类的实例,使通过此方法创建的实例均相同
static Person *person = nil;
//2.只有为空的时候构建实例
if(person == nil)
{
//3.调用allocWithZone构建实例
person = [[super allocWithZone:NULL] init];
}
//4.返回实例
return person;
}
//覆盖allocWithZone方法的实现
+ (id)allocWithZone:(NSZone *)zone
{
//调用sharePerson
return [self sharePerson];
}
@end
|