OC基础—点语法、成员变量的作用域

来源:互联网 发布:域名备案成功 编辑:程序博客网 时间:2024/05/01 11:12

------ android培训java培训、期待与您交流! ----------


                                点语法

点语法:OC设计点语法的目的(让其他语言学习者快速转入OC)

首先建一个Person类,下面是.h文件

#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;}- (void)setAge:(int)age;- (int)age;@end
.m文件中是set,get方法的实现

看一下main函数

#import <Foundation/Foundation.h>#import "Person.h"int main( ){    Person *p = [Person new];    // 点语法的本质是方法的调用    //[p setAge:10];    // .语法 这是赋值   当编译时就会转成上面那行    p.age = 10;        //[p age]    //.语法  这里是取值    int a = p.age;        return 0;}
这里p.age = 10;这就是点语法,看到这个学java的就非常熟悉了,但是不一样这里的.age不是调用成员变量而是调用方法(点语法的本质:方法的调用)(OC中访问成员变量时p->age)。p.age = 10;看到这句是编译器会翻译成[p setAge:10];,看到这句时int a = p.age;,编译器会翻译为[p age];。

没有set,get方法就没法使用点语法!

死循环注意:

- (void)setAge:(int)age{    self.age = age; // 会导致死循环}- (int)age{    return self.age; // 会导致死循环}
self.age = age------->setAge:age,一执行这段代码就会调用setAge方法之后在执行,再转入,在执行………………死循环。

同样return self.age;同样会导致死循环。


                          成员变量的作用域

成员变量的作用域:(@public,@protected,@private,@package)

  1. @public 在任何地方都可以访问这些变量
  2. @private  只能在当前类的对象方法中使用 implementation中默认就是private
  3. @protected  能在当前类和子类的对象方法中直接访问 --->默认  interface中默认就是protected
 !!!什么都不写默认是protected
  4. @package :只要处于同一个框架中 就可以通过变量名直接访问对象的成员变量 他的作用域是出于public与private之间


建立一个Person类,下面是.h文件   

#import <Foundation/Foundation.h>@interface Person : NSObject{    @public //在任何地方都可以访问这些变量    int _age;    @private // 只能在当前类的对象方法中使用    int _height;    @protected // 能在当前类和子类的对象方法中直接访问    int _weight;    int _money; // 这也是protected}- (void)setHeight:(int)height;- (int)height;@end

在.m文件将.h的方法声明

int main( ){     Person *p = [Person new];    p->_age = 100; // 这样可以随便访问    // p->_height; // 这样写是错误的,因为_height是@private类型的(只能在当前类的对象方法也就是Person类的对象方法中使用,哪怕是Person的子类也是不可以的)    // p->_weight;  // 这样在这里写也是不对的,_weight是@protected(只能在当前类和子类的对象方法中使用,在子类的对象方法中是可以这样调用的)        return 0;}
还有一点需要注意,在@implementation中定义的变量默认类型是@private

#import "Person.h"@implementation Person- (void)test{    // 这里的变量与main无法直接调用 哪怕是@public类型的  因为main函数连不到这里来    //main函数连接的只是.h文件   连不到.m文件    _age = 10; // @private}@end

------ android培训java培训、期待与您交流! ----------

0 0