您的位置:首页 > 其它

「OC」点语法和成员变量的作用域

2015-01-21 15:41 351 查看

一、点语法

  (一)认识点语法

    声明一个Person类:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
int _age;
NSString *_name;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setName:(NSString *)name;
- (NSString *)name;

@end


    Person类的实现:

#import "Person.h"

@implementation Person
- (void)setAge:(int)age
{
_age = age;
NSLog(@"setAge");

//会引发死循环
//self.age = age; // [self setAge:age];
}
- (int)age
{
NSLog(@"age");
return self->_age;

//会引发死循环
//return self.age; // [self age];
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end


    点语法的使用:

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{
Person *p = [Person new];

// 点语法的本质还是方法调用
p.age = 10; // [p setAge:10];
int a = p.age; // [p age];

NSLog(@"%d",a);

p.name = @"Jack";
NSString *s = p.name;

NSLog(@"%@",s);

return 0;
}


  (二)点语法的作用

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

  (三)代码演示:  

#import "Student.h"

@implementation Student
- (void)study
{

// _height = 10;
[self setHeight:10];

int h = [self height];

_weight = 100;
}
@end


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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐