oc 基本语法 类 静态变量 常量

//
//  ReViewClass.h
//  hellowWorld
//  本类是oc复习练手类
//  Created by hongtao on 2018/3/26.
//  Copyright © 2018年 hongtao. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 OC常量:
 头文件里声明常量:
 extern NSString * const MyOwnConstant;
 extern NSString * const YetAnotherConstant;
 在.m中通过赋值定义常量:
 NSString * const MyOwnConstant = @"myOwnConstant";
 NSString * const  YetAnotherConstant = @"yetAnotherConstant";
 */
//常量声明 注意:可以在@interface外面声明。
extern const NSString* EAST ;
extern const NSString* WEST ;

@interface ReViewClass : NSObject{
    
    /**
     要点
     (1)基类的私有属性能被继承,不能被使用。
     (2)OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类
     (3)OC只能单继承
     (4)OC所有类都有NSbObject基类
     **/
    
    /**
     范围修饰词
     (1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。
     (2)@protected (受保护的)只能在当前类和子类的对象方法中访问 (默认访问权限)
     (3)@private (私有的)只能在当前类的对象方法中才能直接访问
     (4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通 过变量名访问
     **/
@public int _id ;
    
@public  NSString *_name ;
    
    /*
     不写关键字默认是@private
     private 变量能不能被继承?
     能继承不能用,除非父类提供操作方法
     */
@private   int classId ;
    
    
}
//常量声明,可以放这里,但不能放上面{}内。
//extern const NSString* NORTH =@"north",不能在头文件里直接赋值。
extern const NSString* NORTH;
extern const NSString* SOUTH;


@property (assign) NSString* mDescription ;
/*
 属性:
 (1)关键字@@property
 (2)自动合成getter和setter方法。当声明一个属性(property)的时候编译器默认情况下会自动生成相关的getter和setter方法
 (3)属性(property)关键词能够传递出相关行为的额外信息。属性提供了一些可能会使用的特性来进行声明,
 包括
 assign vs copy vs weak vs strong
 atomic vs vs nonatomic
 readwrite vs readonly
 
 老版本 @property 需要在.m文件中对应使用synthesize  新版synthesize作用如下:
 1.@synthesize 的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成 setter/getter 方法。
 2.禁止@synthesize:如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic 来阻止 @synthesize 自动生成新的 setter/getter 覆盖。
 3.内存管理:@synthesize 和 ARC 无关。
 4.使用:一般情况下无需对属性添加 @synthesize ,但一些特殊情形仍然需要,例如protocol中声明的属性。
 */


/**
 在括号外面声明方法,比如set get 方法。
 */

-(void)set_id :(int)stuId ;
/*
 set_id知识点:
 (1)oc 语法中如果想使用和java一样的"." 去访问类成员变量,那么必须定义一个与变量名相同的get方法。
 注意是get+变量名:
 例如有set_id以后ReViewClass 实例指针可以 ReViewClass._id ;否则 ReViewClass->_id ;
 (2)在点语中可以调用不带参数的任何方法如:-(NSString*)getIdAndName;
 */
-(void)setName:(NSString *)stuName;

-(int)getId;
-(NSString*)getName ;
-(NSString*)getIdAndName: (NSUInteger) stuId;
-(NSString*)getIdAndName;
/*
 可以方法重载 同名不同参数
 */

-(ReViewClass *) init ;
+(int) getInstanceCount ;

@end
//
//  ReViewClass.m
//  hellowWorld
//
//  Created by hongtao on 2018/3/26.
//  Copyright © 2018年 hongtao. All rights reserved.
//

#import "ReViewClass.h"


/**
 静态变量的特性:
 (1)静态变量的作用域是与它定义的位置有关系
 定义在文件中它的作用域就是整个文件,并且是私有的,其他的类或其他的文件是不可以访问该静态变量的
 定义在方法内,它的作用域就是这方法,其他的方法是不可以访问该静态变量
 (2)静态变量只初始化一次(和java中是一样的)
 类方法和实例方法甚至函数都可以使用静态变量
 (3)静态变量定义在源文件中(.m)
 (4)静态变量可以定义在方法或函数体外,也可以定义在方法(类方法和实例方法)或函数体内。
 静态变量定义在方法或函数体外
 该方式适用于当静态变量会被本文件内的多个函数使用的情况,最好能把静态变量定义统一放在源文件的起始处(@implementation的外面),
 
 
 */
//静态变量实例。
static int instanceCount ;

//常量赋值
const NSString* EAST =@"east" ;
const NSString* WEST =@"west";

@implementation ReViewClass

@synthesize mDescription ;

const NSString* NORTH = @"north" ;

-(void)set_id:(int)stuId{
    _id = stuId ;
}
-(void)setName:(NSString *)stuName{
    _name = stuName ;
}
-(int)getId {
    return _id ;
}
-(NSString*)getName {
    return _name ;
}

-(NSString*)getIdAndName: (NSUInteger) stuId;
{
    NSMutableString * str = [[NSMutableString alloc]init];
    [str appendString:_name];
    [str appendString:[NSString stringWithFormat:@"id:%d",_id]];
    return str  ;
}
-(NSString*)getIdAndName;
{
    NSMutableString * str = [[NSMutableString alloc]init];
    if(nil!=_name)
    [str appendString:_name];
    [str appendString:[NSString stringWithFormat:@"id:%d",_id]];
    return str  ;
}

+(NSString *)toString{
    return [NSString stringWithFormat:@"id:%d" ,1000];
}

//类方法用于操作静变量
+(int) getInstanceCount {
    return instanceCount ;
}
-(ReViewClass*) init{
    instanceCount++;
    return [super init];
}



@end
#import <Foundation/Foundation.h>
#import "ReViewClass.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        extern NSString* NORTH ;
        
        // insert code here...
        NSLog(@"Hello, World!");
        ReViewClass *reviwClass = [[ReViewClass alloc]init];
        ReViewClass *reviwClass1 = [[ReViewClass alloc]init];
        ReViewClass *reviwClass2 = [[ReViewClass alloc]init];
        ReViewClass *reviwClass3 = [[ReViewClass alloc]init];
        ReViewClass *reviwClass4 = [[ReViewClass alloc]init];
        [reviwClass setName:@"hongtao"];
        reviwClass._id = 200;
        reviwClass.mDescription = @"string property!";
        NSLog(@"%@,%@",reviwClass.getIdAndName ,[reviwClass getName]);
        NSLog(@"%d",[ReViewClass getInstanceCount]);
        NSLog(@"%@",NORTH);
        //        NSString* temStr =[reviwClass getIdAndName];
        //运行了相应方法,但方法返回值并没有得到- (void)performSelector:原型
        [reviwClass performSelector:@selector(getIdAndName:) withObject:@(123) afterDelay:(1.2f)];
        
        
    }
    return 0;
}

 

posted on 2018-03-29 10:20  wp7ers  阅读(613)  评论(0编辑  收藏  举报