zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    每天一个linux命令
    Python 面向对象-下篇
    Python 面向对象-上篇
    何时会发生隐式类型转换
    C++类型检查
    无符号保留原则
    bool类型为什么可以当做int
    在类的外部定义成员函数注意形式
    局部类
    命名规范
  • 原文地址:https://www.cnblogs.com/mamamia/p/8668261.html
Copyright © 2011-2022 走看看