zoukankan      html  css  js  c++  java
  • 黑马程序员—OC点语法和成员变量作用域

    一、点语法

    1.OC中点语法是方便从事别的语言开发的程序员迅速的转到OC开发当中,先看下面这个例子:

     1 // 声明一个Person类
     2 @interface Person : NSObject
     3 {
     4     int _age;
     5     NSString *_name;
     6 }
     7 - (void)setAge:(int)age;
     8 - (int)age;
     9 @end
    10  
    11 // 实现Person类
    12 @implementation Person
    13 - (void)setAge:(int)age
    14 {
    15     _age = age;
    16 }
    17  
    18 - (int)age
    19 {
    20     return _age;
    21 }
    22 @end

    我们创建一个对象,来给这个对象设置年龄,我们是这样调用的:

    1 Person *p  =  [Person new];
    2 [p setAge:10];
    3 int a  =  [p age];

    这是OC中独有的语法,从事其他语言的开发者刚接触OC的时候可能会觉得很不习惯,为了方便其他语言开发者迅速的上手OC,OC语法就增加了点语法的功能,利用点语法可以这样设置和调用对象的名字:

    1 Person *p  =  [Person new];
    2 p.age = 10;
    3 int a  =  p.age;

    这种语法和其他面向对象中的调用类成员的语法很相似,但是其本质还是很有大差别的

    这里  p.age = 10;  等价于 [p setAge:10];  p.age = 10;  等价于int a  =  [p age];

    点语法是直接调用对象的setter和getter方法来设置成员属性,而其他面向对象语言这样写可能是(如JAVA),可能是直接调用了成员属性来实现赋值和调用。

    2.下面再看一点要注意的地方

      修改上述的Person类的实现

     1 @implementation Person
     2 - (void)setAge:(int)age
     3 {
     4   self.age = age;  // 死循环
     5 }
     6 
     7 - (int)age
     8 {
     9   return self.age;  // 死循环
    10 }
    11 @end

    这样实现setter和getter方法会引发死循环的,因为每当调用setter方法执行self.age = age;时,发现点语法,又开始找自身的setter方法,当然又进入setter方法里面执行self.age = age;了,如此就循环不断。getter方法同理。所以在setter方法和getter中慎用点语法

    二、成员变量作用域

    OC中有4种成员变量,他们的作用域各有不同

    1、@public

           任何地方都能够直接访问

    2、@protected

         可以在当前类和子类的实现@implementation中直接访问(@interfac中默认就是@protected

    3、@private

           只能在当前类的实现@implementation中直接访问,若子类想要访问父类的@private只能通过getter和setter方法。(@implementation中默认是@private)

    4、@package

            同一个体系(框架)中可以访问,作用域介于@private和@public之间

    三、补充

           1.在@implementation中也可以定义成员变量,只是变量默认属性为@private,并且其实际的意义很小,因为一般的工程中都是包含头文件的,没有包含你的m文件,也是这种成员变量不透明,别人也无法调用

           2.没有@interface,只有@implementation,也可以开发一个类,但是编译器会报警告,也就是说不提倡这么写。

           3.@interface和@implementation不能声明同名的成员变量

  • 相关阅读:
    FastApi
    ceph 分布式存储安装
    Linux的inode的理解
    Linux面试题汇总答案
    五,openstack之nova服务的安装(计算节点)
    四,openstack之nova服务的安装(控制节点)
    三,openstack之glance服务的安装
    二,openstack之keystone的简介与安装
    一,openstack基础服务部署
    Kubernetes学习之路(24)之Prometheus监控
  • 原文地址:https://www.cnblogs.com/pangjiayang/p/3956400.html
Copyright © 2011-2022 走看看