zoukankan      html  css  js  c++  java
  • 实例方法与类方法区别

    Objective-C里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。
    注意点一:类方法
    1,类方法可以调用类方法。
    2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
    3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
    4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。
    注意点二:self的规则
    大家需要记住下面的规则:
    1,实例方法里面的self,是对象的首地址。
    2,类方法里面的self,是Class.
    尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。

    类方法创造的对象要不要用release释放?
    答 不需要 这个对象被放到自动释放池中

    Object-C中的私有方法和私有成员变量

    成员变量默认对内是共有的,对外是私有的。

    @interface Controller : NSObject
    {

    @private: NSString *something;
    }
    + (void)thisIsAStaticMethod;
    - (void)thisIsAnInstanceMethod;
    @end

    @interface Controller (Private)
    - (void)thisIsAPrivateMethod; 
    @end

    下面的代码就是怎样获取私有变量(记得加头文件#import ):

    NSString *str;
    Mobj *obj = [[Mobj alloc] init];
    object_getInstanceVariable(obj, "mt_", (void *)&str);
    NSLog(@"%@",str);
    [obj release];

    //=================================== IOS实例方法和类方法的区别 类方法和实例方法  
    1:实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类。
    在实例方法里,根据继承原理发送消息给self和super其实都是发送给self
    在类方法里面self是其他的类的类方法,在类方法中给self发送消息只能发类方法self是类super也是
    什么时候用类方法,要创建一个实例时候获取一个共享实例,或者获取关于类的一些共有信息 2:

    类方法(class method)和实例方法(instance method)。类方法被限定在类范围内,不能被类的实例调用(即脱离实例运行)。alloc就是一种类方法。实例方法限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,被alloc方法返回的对象实例调用。


    NSObject * object1 = [[NSObject alloc] init];


    instance method 以减号 "-" 开头 
    class method 以加号 “+” 开头,相当于static方法 
    3:see see 更健康

    Objective-C

    1.OC是一门基于C的面向对象语言,是C语言的一个超集,同时具有C语言的特征

    2.OC对类的定义和实现以及初始化

    //声明类接口,继承NSObject对象(该对象是OC中所有类的顶级父类,所有类都继承于它)

    @interface ClassName :NSObject 

    //成员属性和成员函数的声明

    +(void)function;//类方法,不需要实例化对象就可以调用的方法

    - (void)function2 :(NSString *)arg;//成员方法,必须通过实例化的对象调用

    @end

    //实现类

    @imlementation ClassName

    //成员属性初始化和方法的定义

    @end

    对象的初始化:ClassName *obj = [[ClassName alloc] init]

    OC中以消息机制传递信息,发送alloc消息给类分配内存空间,发送init消息生成对象,指针指向对象本身。

    3.类方法的调用

    [obj function];

    NSString *str = [NSString stringWithString:@"hello"];

    [obj function2 : str];

    4.输出函数

    根据不同的输出格式输出不同的值 (%d :整形 ,%@:对象,%s:字符串)

    NSlog(@“The result is %d”,intNum); 

    CF代表Core Foundation (Cocoa)

    CFShow发送description给它显示的对象,CFShow打印的信息不会显示时间戳,NSLog会显示,同时CFShow不需要格式字符 串,它只能用于对象

    CFShow(obj);

    5.属性

    支持点表示法:myTableViewCell.textLabel.text = @"hello" 等价于 [[myTableViewCell textLabel] setText:@"hello"];

    使用属性生成器 property

    在h文件中声明: @property int year

    在m文件中合成生成器:@synthesize year

    使用 obj.year = 1999 相当于调用了 [obj setYear:1999];

    可以自定义取值方法和赋值方法(getter and setter)

    -(int)year

    {

    return year;

    }

    - (void) setYear : (int) newYear

    {

    //此处添加了一些基本的内存管理方法,保留新的值,释放以前的值

    if(newYear != year)

    {

    [year release];

    year = [newYear retain];

    }

    }

    也可以绕过oc的命名约定,自己指定getter和setter方法的名称;

    @property(getter = isExist,setter = setExist:) BOOL exist;

    @synthesize exist;

    使用过程中既可以使用新定义的方法名,也可以使用以前的方法(点表示法)

    属性的特性:readwrite readonly assign retain copy nonatomic 

    assign:默认行为,使用@property int year就使用了assign行为,就是给实例变量赋了一个值

    retain:实现了两个功能,一个是保留了赋值时传递的对象,其次是赋值前释放了以前值,使用retain可以实现上面讨论的内存管理的优点,使用时加上 @property (retain)int year;

    copy:发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值;

  • 相关阅读:
    后端结对编程报告(2018.6.6)
    Burn Down Chart(2018.6.4~2018.6.10)
    C#多线程List的非线程安全性
    C#泛型参数多线程与复杂参数多线程
    Java学习之App开发公司手机端设想
    Java学习之SpringBoot整合SSM Demo
    Java学习之Mysql结构优化
    Java学习之Dubbo+ZooKeeper分布式服务Demo
    C# 面向切面编程--监控日志记录方案
    C# 通用类型转换方法
  • 原文地址:https://www.cnblogs.com/uncle4/p/5547229.html
Copyright © 2011-2022 走看看