博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
便利构造器、单件模式
阅读量:5321 次
发布时间:2019-06-14

本文共 4808 字,大约阅读时间需要 16 分钟。

1.方法

冒号属于方法的一部分

-代表实例方法,必须通过对象调用的方法。

+代表静态方法(类方法)。

2.类方法的特点与用处:通过类就可以直接调用类方法

特点:

  • 静态变量用在对象的语言中:当静态变量声明在类中,这个静态变量归该类所有,同时这个类产生的对象共享(可设置和访问)该变量。
  • 静态变量只初始1次,必须有默认值。
  • 类中静态的变量、方法先初始化,实例的变量、方法后初始化。因此类方法里面不能访问实例变量、方法,只能访问静态变量、方法。

常用于:

  • 定义工具类(如下载工具:int download(file,url);面向过程,与实例的东西完全无关):好处不用创建对象,没alloc和init对象,类直接调用类方法,省去定义成员变量等等麻烦。
  • 构建便利构造器(工厂模式): 不用重新再在主函数上alloc对象,另外还有关内存释放的好处。缺点工厂出问题,对象就没了。
  • 构建单例(单件模式):

3.单例模式

  • 整个程序运行周期里,对象只存在一个。
  • 静态变量不会自释放,在运行过程中长驻内存,当程序结束时才会回收。
  • 常用于:操作音频、数据库、文件、控制程序命令。
  • 好处:因为存储在静态区内,所以当程序运行,访问快速方便。作用共享信息,还有减小对象间的依赖关系。常用于存储一些常用的信息。缺点:存在负荷问题。
  • 特点:单例的获取方法是唯一的,在该静态方法已初始化好唯一一个对象。单例向整个系统公开这实例([静态类名  类方法] == 实例对象)接口,其它类导头文件即可使用。单例向整个系统统一了接口模式([静态类名  类方法].属性)。
  • 单例模式与工厂模式区别:工厂可以建多个对象,单例只建1个。

4.选择类型:SEL  变量名 =  @select(方法:);

5.load与initialize共同点:都只执行1次。区别:load要比initialize先执行,load在编译时执行,initalize在第1次发送消息前执行。

在xcode上Build Phases可增删需编译的文件。

6.全局变量与成员变量区别:全局变量只供本类使用,要使其子类都不能使用的话需加@private修饰。成员变量供本类(定义时有下划线)与类外(不用下划线)使用,需声明和实现属性。成员变量的范围广。

7.

+(void)load{    NSLog(@"%s",__func__);//宏func代表当前方法load的名字,常用于调试}

Student.h

@interface Student : NSObject{    int _age;    NSString *_name;    NSString *_address;}@property(nonatomic,assign)int age;@property(nonatomic,retain)NSString *name;@property(nonatomic,retain)NSString *address;/*//实例方法-(void)setName:(NSString *)aName           Age:(int)aAge       Address:(NSString *)aAddress;+(int) addNum1:(int)aNum1          Num2:(int)aNum2;*///-(Student *)initWithName:(NSString *)aName                     Age:(int)aAge                 Address:(NSString *)aAddress;-(void)learn;+(int)count;+(Student *)studentWithName:(NSString *)aName                        Age:(int)aAge                    Address:(NSString *)aAddress;@end

Student.m

#import "Student.h"#import "Appinstance.h"//声明静态变量static int count = 0;@implementation Student@synthesize name = _name,address = _address,age = _age;/*-(void)setName:(NSString *)aName           Age:(int)aAge       Address:(NSString *)aAddress{    self.name = aName;    self.age = aAge;    self.address = aAddress;}+(int) addNum1:(int)aNum1          Num2:(int)aNum2{    return aNum1 + aNum2;}*/-(Student *)initWithName:(NSString *)aName                     Age:(int)aAge                 Address:(NSString *)aAddress{    if(self = [super init])    {        self.name = aName;        self.age = aAge;        self.address = aAddress;        count++;                [Appinstance shareInstance].cityCode = 020;//统一了接口模式    }    return self;}-(void)learn{    NSLog(@"%d 学习IOS",count);    NSLog(@"%@ 也在学",self.name);}#pragma mark -静态方法-+(int)count{    return count;}+(Student *)studentWithName:(NSString *)aName                        Age:(int)aAge                    Address:(NSString *)aAddress{    Student *s = nil;    s = [[Student alloc]initWithName:aName Age:aAge Address:aAddress];    return s;}//+(void)load{    NSLog(@"%s",__func__);//宏func代表当前方法load的名字,常用于调试}+(void)initialize{    NSLog(@"%s",__func__);}@end

 

单例模式

Appinstance.h

@interface Appinstance : NSObject{    int _cityCode;}@property(nonatomic,assign)int cityCode;//声明单例方法+(Appinstance *)shareInstance;@end

Appinstance.m

#import "Appinstance.h"//声明静态变量static Appinstance *instance = nil;@implementation Appinstance@synthesize cityCode = _cityCode;+(Appinstance *)shareInstance{    if (!instance)    {        instance = [[Appinstance alloc]init];    }    return instance;}@end

AppDelegate.m

#import "AppDelegate.h"#import "Student.h"#import "Appinstance.h"#include 
#include
//import与include区别?@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor];// int r = 0;// r = [Student addNum1:1 Num2:1];// NSLog(@"r = %d",r); /* Student *s = [[Student alloc]initWithName:@"bill" Age:67 Address:@"usa"]; [s learn]; Student *s1 = [[Student alloc]initWithName:@"jobs" Age:100 Address:@"usa"]; [s1 learn]; Student *s2 = [[Student alloc]initWithName:@"hen" Age:32 Address:@"uk"]; [s2 learn]; int c = [Student count]; NSLog(@"count = %d",c); Student *s4 = [Student studentWithName:@"killer" Age:16 Address:@"uk"]; //向s4发送learn消息 //[s4 learn]; //这是个编译过程,这两个语句实质是c语言加了运行时,等价于[s4 learn] SEL learnSEL = @selector(learn); //NSLog(@"sel = %d",learnSEL);//实质整形 objc_msgSend(s4, learnSEL); [Appinstance shareInstance].cityCode = 010; //NSTimer? */ [Student alloc]; //.................................................... [self.window makeKeyAndVisible]; return YES;}

 

 

转载于:https://www.cnblogs.com/huen/p/3511225.html

你可能感兴趣的文章
hibernate 多对多双向关联
查看>>
Mysql自带的年月日函数
查看>>
源码实现 --> strcmp
查看>>
Js获取下拉框当前选择项的文本和值
查看>>
BtxCMS.Net 项目
查看>>
KVO讲解
查看>>
centOS7 下安装smb服务器
查看>>
toLocaleString
查看>>
易普优APS高级计划排程系统系列提纲:行业知识,业务建模,排程算法,计划可视化,平台框架,案例分享...
查看>>
面试题-链表
查看>>
Opencv Hello World
查看>>
总有一天你将破蛹而出
查看>>
java final关键字
查看>>
css实现单行和多行文本溢出显示省略号
查看>>
JavaScript核心--Function
查看>>
jmeter 创建web测试计划
查看>>
To change for better
查看>>
在IE浏览器下,PDF将弹出窗口遮挡了
查看>>
表达式简介
查看>>
POJ 1966 无向图点联通度 最小割
查看>>