一、点语法

  (一)认识点语法

    声明一个Person类:

 1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 {
5 int _age;
6 NSString *_name;
7 }
8
9 - (void)setAge:(int)age;
10 - (int)age;
11
12 - (void)setName:(NSString *)name;
13 - (NSString *)name;
14
15 @end

    Person类的实现:

 1 #import "Person.h"
2
3 @implementation Person
4 - (void)setAge:(int)age
5 {
6 _age = age;
7 NSLog(@"setAge");
8
9 //会引发死循环
10 //self.age = age; // [self setAge:age];
11 }
12 - (int)age
13 {
14 NSLog(@"age");
15 return self->_age;
16
17 //会引发死循环
18 //return self.age; // [self age];
19 }
20 - (void)setName:(NSString *)name
21 {
22 _name = name;
23 }
24 - (NSString *)name
25 {
26 return _name;
27 }
28 @end

    点语法的使用:

 1 #import <Foundation/Foundation.h>
2 #import "Person.h"
3
4 int main(int argc, const char * argv[])
5 {
6 Person *p = [Person new];
7
8 // 点语法的本质还是方法调用
9 p.age = 10; // [p setAge:10];
10 int a = p.age; // [p age];
11
12 NSLog(@"%d",a);
13
14 p.name = @"Jack";
15 NSString *s = p.name;
16
17 NSLog(@"%@",s);
18
19 return 0;
20 }

  (二)点语法的作用

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

  (三)点语法的本质

    点语法的本质是方法的调用,而不是访问成员变量,

    当使用点语法时,编译器会自动展开成相应的方法。

    实际上是转换成相应的setter和getter,如果没有setter和getter,则不能使用点语法。

    如:

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

  (三)代码演示:  

 Person.h
 Person.m
 Student.h
 Student.m

  main.m

 1 #import <Foundation/Foundation.h>
2 #import "Person.h"
3 #import "Student.h"
4
5 @implementation Car : NSObject
6 {
7 @public
8 int _speed;
9
10 @protected
11 int _wheels;
12 }
13
14 - (void)setSpeed:(int)speed
15 {
16 _speed = speed;
17 }
18 - (int)speed
19 {
20 return _speed;
21 }
22
23 @end
24
25 int main(int argc, const char * argv[])
26 {
27
28 @autoreleasepool {
29 Student *stu = [Student new];
30
31
32 [stu setHeight:100];
33
34
35 NSLog(@"%d", [stu height]);
36
37 /*
38 Car *c = [Car new];
39 c->_speed = 250;
40 */
41 //c.speed = 10;
42
43 // NSLog(@"%d", c.speed);
44
45 //[c setSpeed:<#(int)#>];
46
47 /*
48 Person *p = [Person new];
49 p->_bbb = 10;
50 p->_age = 100;
51 */
52 //p->_height = 20;
53
54
55 //p->_weight = 10;
56 }
57 return 0;
58 }
 
 

「OC」点语法和成员变量的作用域的更多相关文章

  1. OC中的点语法,成员变量的作用域

    点语法 点语法本质是函数的调用,不是像java中那样,是用来访问成员变量的:oc中访问成员变量是用 -> 访问的: Person *p = [Person new]; p.age = 10; / ...

  2. 「OC」 基本语法

    一.OC简介 在C语言的基础上,增加了一层最小的面向对象语法:完全兼容C语言:可以在OC代码中混入C语言代码,甚至是C++代码:可以使用OC开发Mac OS X平台和iOS平台的应用程序. 二.OC语 ...

  3. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型

    点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...

  4. 「OC」内存管理

    一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空 ...

  5. OC开发系列-成员变量的作用域

    成员变量的作用域 OC中成员变量有四种作用域,同时每一种作用域对应着响应的关键字. * @private:自能在当前类的实现@implementation中访问 * @protected: 可以在当前 ...

  6. [Objective-c 基础 - 2.5] .h和.m文件,点语法,成员变量作用域

    A. 命令行编译和XCode编译 1.在存在多个.m源码实现文件的情况下,若根据需要引入.m文件,使用命令行仅仅编译主.m文件即可,但是XCode会同时编译全部.m文件,会发生编译错误(重复定义全局变 ...

  7. 「OC」block 和 protocol

    一.block   (一)简介 block 是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,block 可以在任何时候执行.在多线程.异步任务.集合遍历.集合排序.动 ...

  8. 「OC」构造方法和分类

    一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...

  9. 「OC」 继承

    一.基本用法 1.设计两个类Bird.Dog 1 // Bird的声明 2 @interface Bird : NSObject 3 { 4 @public 5 int weight; 6 } 7 - ...

随机推荐

  1. Node爬虫

    Node爬虫 参考 http://www.cnblogs.com/edwardstudy/p/4133421.html 所谓的爬虫就是发送请求,并将响应的数据做一些处理 只不过不用浏览器来发送请求 需 ...

  2. 实验时css层叠样式表不更新的情况

    自定义了CSS的样式,希望在页面中起作用.因为MVC中Views/Shared/_Layout.cshtml是所有视图的公共文件,如下: <!DOCTYPE html> <html& ...

  3. Angularjs基础教程

    Angularjs-基础教程 一些angualr的基础概念,适合入门. 1.下载 推荐 bower 或 npm 安装. bower install angular bower install angu ...

  4. android小知识之多个listview在同一界面只有item高亮

    我的工程里面一个activity有两个有圆角的listview,就是 自定义的 CornerListView继承ListView,  然后  我想圆角的listview A点击之后一个item会高亮  ...

  5. 使用 Java 实现 Comet 风格的 Web 应用

    参考这个: http://www.ibm.com/developerworks/cn/web/wa-cometjava/

  6. SharePoint 2007 (MOSS/WSS) - how to remove "Download a Copy" context menu from a Document Library

    One of my friend and colleague asked me this question. I found it tricky and a good post for my blog ...

  7. ZOJ3689 Digging(01背包)

    #include <iostream> #include <cstdio> #include<cmath> #include<algorithm> #i ...

  8. java中如何获取系统时间

    需要引入的包有: import java.util.Date; 此为获取当前系统时间,合适为“1991-01-01” String now = "";    SimpleDateF ...

  9. CD key 生成

    题目描述如下: 某欧软件需要实现简易的CD-KEY算法,输入3个正整数,以空格隔开,根据者3个正整数生成的cd-key字符串.输出格式:xxxx-xxxx-xxxx-xxyy. 包含16个字符,以短划 ...

  10. 手机测试Android程序

    手机测试Android程序   上传者:sanpi329     我也要“分享赚钱” 2014/7/9 关注(23) 评论(0)   声明:此内容仅代表网友个人经验或观点,不代表本网站立场和观点.   ...