现在的位置: 首页 > 综合 > 正文

oc 面向对象特性(实例成员变量作用域限定符,类变量和类方法)

2017年10月24日 ⁄ 综合 ⁄ 共 1762字 ⁄ 字号 评论关闭

实例成员变量作用域限定符

即便从封装的角度出发,实例成员变量应该定义为@private,但作为一种面向对象的语言,Objective-C支持@public、@private和@protected作用域限定。如果一个实例变量没有任何的作用域限定的话,那么缺省就是@protected。 

@public作用域限定的实例变量,可以在任何情况下访问;@private作用域限定的实例变量,只能在这个类里面才可以访问;

@protected作用域限定的实例变量,可以在这个类里面和这个类的派生子类里面可以访问这个变量,在类外的访问是不推荐的,但也可以访问。 

Access.h文件和Access.m文件:

@interface Access: NSObject {
@public
       int publicVar;
@private
       int privateVar;
@protected
       int protectedVar;
} @end
#import "Access.h"
@implementation Access
@end

调用的main函数:

#import <Foundation/Foundation.h>
#import "Access.h"
int main (int argc, const char * argv[]) {
    Access *a = [[Access alloc] init];
    a->publicVar = 5;
    NSLog(@"public var: %i\n", a->publicVar);

    a->protectedVar = 6;
    NSLog(@"protectedVar var: %i\n", a->protectedVar);
    
    //不能编译
    //a->privateVar = 10;
    //NSLog(@"private var: %i\n", a->privateVar);
    return 0;
}

小结

@public、@private和@protected作用域限定只能修饰的实例成员变量,不能修饰类变量,更不能修饰方法 。

类变量和类方法



ClassA.h文件:

#import <Foundation/NSObject.h>
static int count;
@interface ClassA: NSObject
+(int) initCount;
+(void) initialize;
@end

ClassA.m文件:

#import "ClassA.h"
@implementation ClassA
-(id) init {
       self = [super init];
       count++;
       return self;
}
+(int) initCount {
       return count;
}
+(void) initialize {
       count = 0;
} @end

说明:

init方法是默认构造方法,在这个构造方法中累计类变量count,在实例方法中可以访问类变量的,但是类方法不能访问实例变量。initCount 方法是一个普通的类方法,用于返回类变量count,initialize方法是非常特殊的类方法,它是在类第一次访问时候被自动调用,因此它一般用来初始化类变量的,类似于C#中的静态构造方法。 

调用的main函数:

#import <Foundation/Foundation.h>
#import "ClassA.h"
int main( int argc, const char *argv[] ) {
    ClassA *c1 = [[ClassA alloc] init];
    ClassA *c2 = [[ClassA alloc] init];

    // print count
    NSLog(@"ClassA count: %i", [ClassA initCount] );
    ClassA *c3 = [[ClassA alloc] init];
    NSLog(@"ClassA count: %i", [ClassA initCount] );
    [c1 release];
    [c2 release];
    [c3 release];
    return 0;
}
ClassA count: 2
ClassA count: 3

小结:

在第一次实例化ClassA时候会调用两个方法: initialize类方法和实例构造方法init,然后再次实例化ClassA时候只是调用实例构造方法init,而没有调用initialize类方法。

这样类变量count被一直累加,它隶属类因此c1实例可以访问,c2和c3都可以访问。 


抱歉!评论已关闭.