美文网首页人生几何?
OC基础-类 、方法(二)

OC基础-类 、方法(二)

作者: 浮华_du | 来源:发表于2021-08-26 14:35 被阅读0次

    一.类

    类的声明:

    @interface 类名 : NSObject
    {
     这类事物具有的共同的特征,将它们定义为变量
    }
    功能就是一个方法,将方法的声明写在这里
    @end
    

    类的实现:

    @implementation 类名
    将方法的实现写在这里
    @end
    

    类的对象的创建和使用

    类名 *对象名 = [类名 new];
    

    默认情况下,对象的属性是不允许被外界直接访问的,如果允许对象的属性可以被外界访问,那么就需要在声明属性的时候加上一个@public关键字。
    例如:

    @interface Person : NSObject
    {
     @public
     NSString *_name;
     int _age;
     float _height;
    }
    
    @end
    

    访问

    对象名->属性名 = 值;
    对象名->属性名;//(一般使用)
    (*对象名).属性名;
    

    完整例子

    #import <Foundation/Foundation.h>
    @interface Student : NSObject
    {
     @public
     NSString *_name;
     int _age;
     int _Chinese;
     int _Math;
     int _English;
    }
    @end
    
    @implementation Student
    @end
    
    
    int main(int argc, const char * argv[]) {
        
        Student *s1 = [Student new];
        s1->_name = @"旺仔";
        s1->_age = 5;
        s1->_Chinese = 90;
        s1->_Math = 80;
        s1->_English = 90;
    
        NSLog(@"Name:%@,Age:%d,Chinese:%d,Math:%d,English:%d",
         s1->_name,
         s1->_age,
         s1->_Chinese,
         s1->_Math,
         s1->_English
        );
        return 0;
    }
    //2021-07-21 10:12:46.193138+0800 TestOc[6732:66503] Name:旺仔,Age:5,Chinese:90,Math:80,English:90
    

    二.方法 (减号-)

    1.无参数方法

    无参数的方法的声明:

    位置:在@interface的大括号的外面
    语法:

    -(返回值类型)方法名称;
    -(void)run;//表示声明了一个无返回值并且无参数的方法,方法的名字叫run,这个需要写在@interface的带括号外面,与@end的里面
    

    无参数的方法的实现:

    位置:在@implementation之中实现
    语法:

    -(返回值类型)方法名称
    {
    方法实现的代码;
    }
    
    @implementation Person
    -(void)run
    {
     NSLog(@“I’m running!”);
    }
    @end
    

    无参数的方法的调用:

    [对象名 方法名];
    Person *p1 = [Person new];
    [p1 run];
    

    2.有参数方法(同无参),只是增加了形参

    3.直接看完整例子

    
    #import <Foundation/Foundation.h>
    @interface Phone : NSObject
    {
     @public
     NSString *_brand;
     NSString *_color;
     float _weight;
     NSString *_size;
    }
    -(void)show;
    -(void)call:(int)phoneNumber;
    -(void)sendMessage:(int)phoneNumber and:(NSString *)message;
    @end
    
    @implementation Phone
    
    -(void)show
    {
     NSLog(@"本机信息:%@牌 颜色:%@ 重量:%.2fg 尺寸:%@",
    _brand,
    _color,
    _weight,
    _size);
    }
    -(void)call:(int)phoneNumber
    {
     NSLog(@"正在拨通%d的电话……",phoneNumber);
    }
    -(void)sendMessage:(int)phoneNumber and:(NSString *)message
    {
     NSLog(@"已将短信内容:%@ 发送给%d",message,phoneNumber);
    }
    
    @end
    
    int main(int argc, const char * argv[])
    {
     @autoreleasepool
     {
     Phone *phone1 = [Phone new];
     phone1->_brand = @"Apple";
     phone1->_color = @"深空灰";
     phone1->_weight = 237.0f;
     phone1->_size = @"6.1英寸";
     
     [phone1 show];
     [phone1 call:987654321];
     [phone1 sendMessage:987654321 and:@"我晚点到!"];
     }
     return 0;
    }
    //2021-07-21 10:30:16.707200+0800 TestOc[8980:86732] 本机信息:Apple牌 颜色:深空灰 重量:237.00g 尺寸:6.1英寸
    //2021-07-21 10:30:16.707539+0800 TestOc[8980:86732] 正在拨通987654321的电话……
    //2021-07-21 10:30:16.707589+0800 TestOc[8980:86732] 已将短信内容:我晚点到! 发送给987654321
    

    三.类方法(加号+)

    声明:

    +(void)sayHi;
    

    调用:

    [类名 类方法名];
    
    注意:
    • 在类方法中不能直接访问属性。
      原因是:
      属性是在对象创建的时候,跟随着对象一起创建在对象之中。类第一次被访问的时候,会做类加载,是把类的代码存储在代码段。
      因为属性只有在对象创建的时候才会创建在对象之中,而类方法在执行的时候,有可能还没有对象,当没有对象的时候也就没有属性,所以在类方法中无法直接访问属性。
      虽然不能直接访问属性,但是我们可以在类方法中创建一个对象,这个时候就可以访问这个对象的属性了。
      同理,在类方法中也不能通过self直接访问对象方法。

    相关文章

      网友评论

        本文标题:OC基础-类 、方法(二)

        本文链接:https://www.haomeiwen.com/subject/hktjmltx.html