IOS 开发学习总结 objectivec面向对象之——成员变量,模拟类变量,单例模式 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    OC 中变量根据定义位置的不同,可以分为3大类:成员变量,局部变量和全局变量,

IOS 开发学习总结 objectivec面向对象之——成员变量,模拟类变量,单例模式

    之前提到过方法是由函数演化而来的,所以不管是方法中定义的变量,还是函数中定义的变量,都是局部变量。

成员变量及其运行机制

    成员变量:指的是在类接口部分或类实现部分定义的变量。

    说明:objective-c 的成员变量都是实例变量,并不支持真正的类变量。

    实例变量从该类的实例被创建开始起存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。实例变量可以理解为实例成员变量,它作为实例的一个成员,与实例共存亡。

    只要实例存在,程序就可以访问该实例的实例变量,在程序中访问实例变量的语法:实例->实例变量;

    示例程序:

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKPerson : NSObject{    @public    // 定义2个实例变量    NSString* _name;    int _age;}@end@implementation FKPerson@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 创建Person对象        FKPerson* p = [[FKPerson alloc] init];        // 通过指针变量来访问Person对象_name、_age实例变量        NSLog(@p变量的_name实例变量的值是:%@,p对象的_age成员变量的值是:%d            , p->_name , p->_age);        // 直接为p的name实例变量赋值        p->_name = @孙悟空;        // 直接为p的age实例变量赋值        p->_age = 500;        // 再次通过指针变量来访问Person对象_name、_age实例变量        NSLog(@p变量的_name实例变量的值是:%@,p对象的_age成员变量的值是:%d            , p->_name , p->_age);        // 创建第一个FKPerson对象        FKPerson* p1 = [[FKPerson alloc] init];        // 创建第二个FKPerson对象        FKPerson* p2 = [[FKPerson alloc] init];        // 分别为两个FKPerson对象的name成员变量赋值        p1->_name = @张三;        p2->_name = @孙悟空;    }}</foundation></code>

    总结说明:成员变量无需显式初始化,只要为一个类定义了实例变量,系统会为实例变量执行默认初始化。基本类型的实例变量默认被初始化为0;指针类型的成员变量默认被初始化为 nil.

    从内存存储的角度看,objective-c 的对象与C 的结构体相似。

    这里用上面的代码中定义的类创建2个实例。结合示意图来说明 OC 中实例变量的初始化和内存中的运行机制。

<code class="hljs" fix="">// 创建第一个FKPerson对象FKPerson* p1 = [[FKPerson alloc] init];</code>
<code class="hljs" fix="">// 创建第二个FKPerson对象FKPerson* p2 = [[FKPerson alloc] init];</code>
<code class="hljs" lasso="">// 分别为两个FKPerson对象的name成员变量赋值        p1->_name = @张三;        p2->_name = @孙悟空;</code>

   

   

   

模拟类变量

    通过内部局部变量来模拟类变量,

电脑资料

IOS 开发学习总结 objectivec面向对象之——成员变量,模拟类变量,单例模式》(https://www.unjs.com)。

    **注意:**static关键字不能修饰成员变量,只能修饰局部变量,全局变量和函数。

    为了模拟类变量,可以在类实现部分定义个 static 修饰的全局变量,并提供一个类方法来暴露该全局变量。

    示例代码:

    头文件:FKUser.h

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKUser : NSObject+ (NSString*) nation;+ (void) setNation: (NSString*) newNation;@end</foundation></code>

    实现文件:FKUser.m

<code class="hljs" bjectivec="">#import FKUser.hstatic NSString* nation = nil;@implementation FKUser+ (NSString*) nation{    // 返回nation全局变量    return nation;}+ (void) setNation: (NSString*) newNation{    // 对nation全局变量赋值    if(![nation isEqualToString: newNation])    {        nation = newNation;    }}@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 为FKUser的类变量赋值        [FKUser setNation:@中国];        // 访问FKUser的类变量        NSLog(@FKUser的nation类变量为:%@            , [FKUser nation]);         }}</code>

单例模式

    如果一个类始终只能创建一个实例,则这个类称为单例类。

    单例类可以通过 static 全局变量来实现,程序考虑定义一个 static全局变量,该变量用于保存已经创建的 singleton 对象——每次程序需要获取该实例的时候,先判断该 static 全局变量是不是为 nil, 如果为 nil,则初始化一个实例并赋值给 static 全局变量。

    示例程序:

    FKSingleton.h

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKSingleton : NSObject+ (id) instance;@end</foundation></code>

    FKSingleton.m

<code class="hljs" bjectivec="">#import FKSingleton.hstatic id instance = nil;@implementation FKSingleton+ (id) instance{    // 如果instance为nil    if(!instance)    {        // 创建一个Singleton实例,并将该实例赋给instance全局变量        instance = [[super alloc] init];    }    return instance;}@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 判断两次获取的实例是否相等,程序将会返回1(代表真)        NSLog(@%d ,             [FKSingleton instance] == [FKSingleton instance]);    }}</code>

最新文章

    OC 中变量根据定义位置的不同,可以分为3大类:成员变量,局部变量和全局变量,

IOS 开发学习总结 objectivec面向对象之——成员变量,模拟类变量,单例模式

    之前提到过方法是由函数演化而来的,所以不管是方法中定义的变量,还是函数中定义的变量,都是局部变量。

成员变量及其运行机制

    成员变量:指的是在类接口部分或类实现部分定义的变量。

    说明:objective-c 的成员变量都是实例变量,并不支持真正的类变量。

    实例变量从该类的实例被创建开始起存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。实例变量可以理解为实例成员变量,它作为实例的一个成员,与实例共存亡。

    只要实例存在,程序就可以访问该实例的实例变量,在程序中访问实例变量的语法:实例->实例变量;

    示例程序:

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKPerson : NSObject{    @public    // 定义2个实例变量    NSString* _name;    int _age;}@end@implementation FKPerson@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 创建Person对象        FKPerson* p = [[FKPerson alloc] init];        // 通过指针变量来访问Person对象_name、_age实例变量        NSLog(@p变量的_name实例变量的值是:%@,p对象的_age成员变量的值是:%d            , p->_name , p->_age);        // 直接为p的name实例变量赋值        p->_name = @孙悟空;        // 直接为p的age实例变量赋值        p->_age = 500;        // 再次通过指针变量来访问Person对象_name、_age实例变量        NSLog(@p变量的_name实例变量的值是:%@,p对象的_age成员变量的值是:%d            , p->_name , p->_age);        // 创建第一个FKPerson对象        FKPerson* p1 = [[FKPerson alloc] init];        // 创建第二个FKPerson对象        FKPerson* p2 = [[FKPerson alloc] init];        // 分别为两个FKPerson对象的name成员变量赋值        p1->_name = @张三;        p2->_name = @孙悟空;    }}</foundation></code>

    总结说明:成员变量无需显式初始化,只要为一个类定义了实例变量,系统会为实例变量执行默认初始化。基本类型的实例变量默认被初始化为0;指针类型的成员变量默认被初始化为 nil.

    从内存存储的角度看,objective-c 的对象与C 的结构体相似。

    这里用上面的代码中定义的类创建2个实例。结合示意图来说明 OC 中实例变量的初始化和内存中的运行机制。

<code class="hljs" fix="">// 创建第一个FKPerson对象FKPerson* p1 = [[FKPerson alloc] init];</code>
<code class="hljs" fix="">// 创建第二个FKPerson对象FKPerson* p2 = [[FKPerson alloc] init];</code>
<code class="hljs" lasso="">// 分别为两个FKPerson对象的name成员变量赋值        p1->_name = @张三;        p2->_name = @孙悟空;</code>

   

   

   

模拟类变量

    通过内部局部变量来模拟类变量,

电脑资料

IOS 开发学习总结 objectivec面向对象之——成员变量,模拟类变量,单例模式》(https://www.unjs.com)。

    **注意:**static关键字不能修饰成员变量,只能修饰局部变量,全局变量和函数。

    为了模拟类变量,可以在类实现部分定义个 static 修饰的全局变量,并提供一个类方法来暴露该全局变量。

    示例代码:

    头文件:FKUser.h

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKUser : NSObject+ (NSString*) nation;+ (void) setNation: (NSString*) newNation;@end</foundation></code>

    实现文件:FKUser.m

<code class="hljs" bjectivec="">#import FKUser.hstatic NSString* nation = nil;@implementation FKUser+ (NSString*) nation{    // 返回nation全局变量    return nation;}+ (void) setNation: (NSString*) newNation{    // 对nation全局变量赋值    if(![nation isEqualToString: newNation])    {        nation = newNation;    }}@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 为FKUser的类变量赋值        [FKUser setNation:@中国];        // 访问FKUser的类变量        NSLog(@FKUser的nation类变量为:%@            , [FKUser nation]);         }}</code>

单例模式

    如果一个类始终只能创建一个实例,则这个类称为单例类。

    单例类可以通过 static 全局变量来实现,程序考虑定义一个 static全局变量,该变量用于保存已经创建的 singleton 对象——每次程序需要获取该实例的时候,先判断该 static 全局变量是不是为 nil, 如果为 nil,则初始化一个实例并赋值给 static 全局变量。

    示例程序:

    FKSingleton.h

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKSingleton : NSObject+ (id) instance;@end</foundation></code>

    FKSingleton.m

<code class="hljs" bjectivec="">#import FKSingleton.hstatic id instance = nil;@implementation FKSingleton+ (id) instance{    // 如果instance为nil    if(!instance)    {        // 创建一个Singleton实例,并将该实例赋给instance全局变量        instance = [[super alloc] init];    }    return instance;}@endint main(int argc , char * argv[]) {    @autoreleasepool{        // 判断两次获取的实例是否相等,程序将会返回1(代表真)        NSLog(@%d ,             [FKSingleton instance] == [FKSingleton instance]);    }}</code>