zoukankan      html  css  js  c++  java
  • OC点语法和变量作用域

    OC点语法和变量作用域

    一、点语法

    (一)认识点语法

    声明一个Person类:

    复制代码
     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Person : NSObject
     4 {
     5     int _age;//默认为@protected
     6 }
     7 
     8 - (void)setAge:(int)age;
     9 - (int)age;
    10 
    11 @end
    复制代码

        Person类的实现:

    复制代码
     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 - (void)setAge:(int)age
     6 {
     7     _age = age;// 不能写成self.age = newAge,相当与 [self setAge:newAge];
     8 }
     9 
    10 - (int)age  //get方法
    11 {
    12     return _age;
    13 }
    14 
    15 @end
    复制代码

    点语法的使用:

    复制代码
     1 #import <Foundation/Foundation.h>
     2 #import "Person.h"
     3 
     4 int main(int argc, const char * argv[])
     5 {
     6 
     7     @autoreleasepool {
     8         
     9         // insert code here...
    10         Person *person = [[Person alloc] init];
    11         
    12         //[person setAge:10];
    13         person.age = 10;//点语法,等效与[person setAge:10];
    14 //这里并不是给person的属性赋值,而是调用person的setAge方法
    15         
    16         //int age = [person age];
    17         int age = person.age;//等效与int age = [person age]
    18        NSLog(@"age is %i", age);
    19         [person release];
    20         
    21     }
    22     return 0;
    23 }
    复制代码

    (二)点语法的作用

    OC设计点语法的目的,是为了让其他语言的开发者可以很快的上手OC语言开发,使用点语法,让它和其他面向对象的语言如java很像。

    (三)点语法的本质

    点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。

    如:

    Stu.age=10;展开为:[stu setAge:10];

    int  a=stu.age;展开为:[stu age];

    编译器如何知道是set方法还是get方法?主要是看赋值(可以使用断点调试来查看)。

    在OC中访问成员变量只有一种方式即使用-> 如stu->age,这种情况要求在@public的前提下。

    (四)点语法的使用注意

    下面的使用方式是一个死循环:

       (1)在set方法中,self.age=age;相当于是[self setAge:age];

    (2)在get方法中,return self.age;相当于是[self age];

    二、变量作用域

    (一)变量的作用域主要分为四种:

    (1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。

    (2)@protected (受保护的)只能在当前类和子类的对象方法中访问

    (3)@private (私有的)只能在当前类的对象方法中才能直接访问

    (4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

    (二)使用注意和补充

    (1)在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在这里声明的成员变量是@private的。在.m中定义的成员变量不能喝它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。

    (2)在@interface  @end之间声明的成员变量如果不做特别的说明,那么其默认是protected的。

    (3)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/geek6/p/3919410.html
Copyright © 2011-2022 走看看