首页 > 代码库 > 黑马程序员------OC之点语法、成员变量作用域、@property和@synthesize
黑马程序员------OC之点语法、成员变量作用域、@property和@synthesize
-----iOS培训、Android培训、Java培训,期待与您交流-----
OC之点语法、成员变量作用域、@property和@synthesize
一、点语法
1)点语法基本概念:当我们使用面向对象的封装特性后,将成员变量私有化,采取使用setter方法和getter方法向外面提供成员变量访问方案。那么我们知道,OC的调用方法的方式是很独特的,采用的是 [对象名(类名) 方法名] 的方式 ,那么很多Java、C#程序员就不习惯了,在Java、C#这些主流的面向对象语言中,调用方法的方式都是采用 对象名(类名).方法名(), 如果成员变量采取public访问权限时,还可以直接 对象名.成员变量 = 值; 的形式。可能是出于让Java、C#程序员迅速习惯OC的语法,苹果公司让OC诞生了点语法。
2)点语法代码初体验
首先,我们声明一个Person类
Person.h
// // Person.h // 04-点语法 // #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.m
#import "Person.h" @implementation Person - (void)setAge:(int)age { _age = age; } - (int)age { return _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]; p.name = @"Jack"; NSString *s = p.name; NSLog(@"%@", s); return 0; }
注意点:
1)点语法的本质是调用类的getter方法和setter方法,如果类中没有getter方法和setter方法就不能使用点语法。
点语法本质:
// 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age];
2)下面的不恰当调用,会导致死循环
// 会引发死循环 //self.age = age; // 相当于在调用 [self setAge:age]; }
// 会引发死循环 //return self.age;//相当于 [self age];
二、成员变量作用域
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
@public // 在任何地方都能直接访问对象的成员变量 int _age; @private // 只能在当前类的对象方法中直接访问 int _height; @protected // 能在当前类和子类的对象方法中直接访问 int _weight; int _money;
注意:
1)@interface和@implementation中不能声明同名的成员变量
2)子类继承父类,子类拥有父类的@public和@protected修饰的成员变量
3)如果在类中声明一个属性,没有指定访问权限,默认是@protected
三、@property 和 @synthesize
这两个关键字的出现,就是为了剔除代码中的setter方法和getter方法
1)@property
// @property:可以自动生成某个成员变量的setter和getter声明 @property int age; //相当于下面这两句: - (void)setAge:(int)age; - (int)age;
2)@synthesize
// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量 @synthesize age = _age; @synthesize height = _height; @synthesize weight = _weight, name = _name;
这样,我们就省去了写setter方法和getter方法的时间,当然写那个也是极其无聊也是毫无意义。
但是,即便是这样,还是很不爽,在xcode的老版本中,为了避免书写setter方法和getter方法,我们还必须要在@interface 和 @end之间写上 @property int _age; 在@implementation 和 @end 之间写上 @synthesize的代码,很幸运,你们生活在一个幸福的时代,自从xcode4.4之后,@property int _age; 这句代码就把@property和@synthesize的活儿都给干了。
它主要做了下面这几件事:
1)生成_age成员变量的get和set方法的声明;
2)生成_age成员变量set和get方法的实现;
3)生成一个_age的成员变量。
当然,@property方法生成的getter方法和setter方法可能满足不了您的需求,您也可以自己手动添加getter方法和setter方法,如果手动写了setter方法@property就不会生成setter方法,但还是会生成getter方法,getter同理,如果您将setter方法,getter方法都进行手动书写了,@property将不会为您生成相应的getter方法和setter方法。
黑马程序员------OC之点语法、成员变量作用域、@property和@synthesize
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。