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;}