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)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。

时间: 2024-08-01 08:29:12

OC点语法和变量作用域的相关文章

Python基本语法_变量作用域LEGB

目录 目录 软件系统 变量的作用域 高级语言对数据类型的使用过程 作用域的产生 作用域的类型 Llocal局部作用域 Eenclosing嵌套作用域 Gglobal全局作用域 Bbuilt-in内置作用域 变量名解析LEGB法则 实例说明 对变量的引用 对变量的修改 global关键字 nonlocal关键字 命名空间和作用域的区别 软件系统 系统 Ubuntu 14.04 软件 Python 2.7.3 IPython 4.0.0 变量的作用域 在Python程序中创建.改变.查找变量名时,都

JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中,用户可以通过指定数据类型和标识符来声明变量,其基本语法为: DataType identifier;  或  DataType identifier = value; 其中,DataType是变量类型,如int/string/char/double/boolean等:identifier是变量名称,即标识符:value就是声明变量的值. 注: a.标识符由数字0-9.大小写字母.下划线.美元符号.人民币符号以及

linux shell 自定义函数方法(定义、返回值、变量作用域)_linux shell

一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255 实例(testfun1.sh): #!/bin/sh fSum 3 2; function fSum

《深入理解JavaScript》——1.13 变量作用域和闭包

1.13 变量作用域和闭包 在JavaScript中,通过在变量前使用var语句声明变量: 你可以使用单个var语句声明和初始化多个变量: 但是我推荐使用单独声明每一个变量(原因参考26.4.1"语法").因此,我会将之前的语句重写为: 由于前置的缘故(参考1.13.2"变量的提升特性"),通常它的最佳实践是在一个函数的开始部分声明变量. 1.13.1 变量是函数作用域的一个变量的作用域总是完整的函数(相对于当前块).例如: 我们可以看到变量tmp并不局限于(1)行

linux shell自定义函数(定义、返回值、变量作用域)介绍_linux shell

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

[JAVA]变量作用域的问题

变量|问题 变量作用域的问题:public String getAnswer() {  String myAnswer;  try  {      BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));      myAnswer=new String(bfReader.readLine().toString());   System.out.println("你输入的是:"+myAns

javascript变量作用域

javascript变量作用域只有两种情况:全局作用域.函数作用域 没有代码块作用域,因而要养成一处声明全部变量的编程习惯(文件头部.函数头部). function test(){ var abc="123"; efg="456"; put("in test abc="+abc); put("in test efg="+efg); } function test1(){ var abc; put("in test1

浅谈PHP变量作用域以及地址引用问题

 这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下 作用域的概念:   在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域.   主要的常用的包括:局部变量.全局变量.静态变量.   1.局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快.仅在函数内有效.   2.全局变量:与局部变量相反,全局变量可以在程序的任何地方访问.只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量.在

Javascript变量作用域详解

         这篇文章主要是对Javascript变量作用域进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 变量的作用域指的是变量的可见性,而生命周期则(存活期)则是从另一个角度考察变量.         JS中变量的作用域分为全局变量和局部变量,函数内定义的称为局部变量,函数外的称为全局变量.("函数外的称为全局变量"是相对的,另此处讨论的前提是用var显式声明的变量,函数内不用var定义的变量默认是全局变量,当然忽略var声明变量是不赞成的).    代码如