实例方法和类方法的区别
区别1:
实例方法: 实例方法属于实例,也就是说属于对象,通过实例调用的方法就是实例方法,实例方法只能通过实例(对象)调用
声明方式: -(返回值)方法名:参数 强调的是 “-”

类方法: 类方法属于类的,调用的时候,只能使用类名调用
声明方式:+(返回值)方法名:参数 强调的是 “+”

区别2:
实例方法: 实例方法在运行时只关注实例的信息(实例变量),实例方法中可以访问或修改实例变量

类方法: 类方法在运行时只关注类中的信息,类方法中不可访问或修改实例变量

区别3:
实例方法: 实例方法中可以访问类方法
类方法: 类方法中不能访问实例方法


工厂方法
工厂方法是类方法
工厂创建对象用
工厂方法 返回值是 当前类型, 方法名去掉前缀首字母小写如 TRPoint类的工厂方法名是 point

下面来上代码:


main.m文件的代码


#import <Foundation/Foundation.h>
#import "MyPoint.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
MyPoint *point = [[MyPoint alloc]init];

//实例方法属于实例,用实例调用
[point show];

//类方法属于类,用类名调用
//[point2 show2];error

[MyPoint show2];//right

MyPoint *point2 = [ MyPoint createPoint];
[point2 show];//x = 10,y = 20
}
return 0;
}


Mypoint.h文件的代码

#import <Foundation/Foundation.h>

@interface MyPoint : NSObject
@property int x;
@property int y;
-(id)init;
//With W一定要大写
//-(id)initWithX:(int)x andY:(int)y;
-(void)show;//声明实例方法
+(void)show2;//声明类方法
+(void)show3;//声明类方法
+(id)createPoint;//创建点的类方法
@end


MyPoint.m文件的代码

#import "MyPoint.h"


@implementation MyPoint
-(id)init
{
self = [super init];
if (self) {
self.x = 100;//_x = 100;
self.y = 200;
}

return self;
}

-(void)show
{
//实例方法可以修改实例变量,实例方法中self表示当前对象,通过对象可以找到实例变量
NSLog(@"x = %d,y = %d",_x,_y);

//实例方法中可以调用类方法
//[MyPoint show2];

}

+(void)show2
{
//类方法中self不再是对象,那么类方法中就没有当前对象的概念了,找不到对象就更加找不到对象中的实例变量了
//类方法中不可以访问实例变量
// NSLog(@"x = %d,y = %d",_x,_y);
//类方法中self标书当前类
NSLog(@"类方法被调用");

//类方法中不可以调用实例方法

//[self show];error

//类方法中可以调用类方法
[self show3];
}

+(void)show3
{
NSLog(@"我也是一个类方法");
}