Objective-C——属性与成员变量辨析
来源:互联网 发布:建筑施工图软件最快 编辑:程序博客网 时间:2024/05/22 17:08
上篇中提过,成员变量是在一对大括弧里面声明的;而属性是用先@property声明再用@synthesize合成的。属性是oc语言的一个新的机制,在实际的使用中这两者还是有不少区别的。
类中的成员变量,通过权限修饰符@protected、@private、@public更该它的被访问权限,而属性是属于类的对象的,通过生成一个该类的对象我们就可以获得它的访问权。
FirstClass.h
#import <Foundation/Foundation.h>@interface FirstClass : NSObject{ //类的成员变量,默认访问权限为protect int m;}//+表示类方法+(void)classFun;//-表示实例方法-(id)initWithName:(NSString *)aName andNum:(int )n;-(void)print;@property(nonatomic,strong)NSString *name;@property(nonatomic,assign)int count;@end
在头文件中声明了(NSString *)name和(int )count两个变量,@property声明变量时会自动的为我们生成以下划线开头的实例变量_name,及_count.并生成他们的setter和getter方法。当在FirstClass.m实现文件中省略@synthesize合成属性时,编译器自动生成_name和_count两个实例变量。
//self.name访问对象的属性,_name是name的实例可直接使用,也即self.name=_name;
当然这也不是说@synthesize没有作用,@synthesize variable=xxx,此时self.variable的实际操作对象为xxx而不是_variable;
当我们在实现文件中
@synthesize name;
编译器会自动生成name的实例变量,以及它相应的setter和getter方法。注意此时生成的实例变量就是name.而不是_name.
OC中"."与"->"的区别
OC中对象的操作都是通过指针调用实现的,所有的成员变量都可以通过"->"来获取。
“.”操作符在之前的OC版本中是没有的,为了适应JAVA/C++等程序员的使用习惯后来新加入的特性。"."在OC中实际上是方法的调用。
self.name=aName;//.语法放在等号左边相当于调用setter方法
NSLOg(@"%@",self.name);//.语法放在等号右边相当于调用getter方法
下面是测试上面范例的代码
FirstClass.h
//// FirstClass.h// 类属性方法成员变量//// Created by student on 14-9-17.// Copyright (c) 2014年 codebat. All rights reserved.//#import <Foundation/Foundation.h>@interface FirstClass : NSObject{ //类的成员变量,默认访问权限为protect @public int m;}//+表示类方法+(void)classFun;//-表示实例方法-(id)initWithName:(NSString *)aName andNum:(int )n;-(void)print;@property(nonatomic,strong)NSString *name;@property(nonatomic,assign)int count;@end
FirstClass.m
//// FirstClass.m// 类属性方法成员变量//// Created by student on 14-9-17.// Copyright (c) 2014年 codebat. All rights reserved.//#import "FirstClass.h"@implementation FirstClass@synthesize name;//此时仅生成name实例,_name不可用@synthesize count=_count;//指定实例变量为_count,这句话省略效果一样+(void)classFun{ NSLog(@"类方法");}-(id)initWithName:(NSString *)aName andNum:(int )m{ if(self=[super init]) { self.name=aName; _count=m; } return self;}-(void)print{ NSLog(@"%@ %d",self.name, self.count);}@endmain.m
//// main.m// 类属性方法成员变量//// Created by student on 14-9-17.// Copyright (c) 2014年 codebat. All rights reserved.//#import <Foundation/Foundation.h>#import "FirstClass.h"int main(int argc, const char * argv[]){ @autoreleasepool { FirstClass *class=[[FirstClass alloc]initWithName:@"doubi" andNum:21]; class->m=20; class.count=22; class.name=@"sds"; [class print]; } return 0;}
#################################################新增部分##################################################################
若在.h文件中做出如下声明
@interface Apple : NSObject{@public NSString *color;}@property (nonatomic,copy) NSString *color;@end
在main.m文件中可以分别为color成员变量及color属性赋以不同的值。
int main(int argc, const char * argv[]){ @autoreleasepool { Apple *apple = [[Apple alloc] init]; apple.color = @"yello"; apple->color = @"green"; NSLog(@"%@",apple.color); NSLog(@"%@",apple->color); } return 0; }
可以看到最后输出结果是不一致的。成员变量通过指针操作符访问,而属性是通过“.”方法调用取值的。OC中会自动为属性color合成setter与getter方法,实际上对属性的值的访问都是对实例变量_color的操作。也即一个apple对象此时有两个实例变量color和_color.
- Objective-C——属性与成员变量辨析
- objective-c 成员变量与属性
- Objective-C——类、方法、属性、成员变量
- Objective-C——类、方法、属性、成员变量
- ios学习路线—Objective-C(Runtime成员变量与属性)
- iOS --- Objective-C中类的成员变量与属性
- Objective-C Runtime 运行时(二):成员变量与属性
- Objective-C Runtime 成员变量与属性
- Objective-C—方法与成员变量、匿名对象
- Objective-C学习笔记(十七)——成员变量和属性详解
- Objective-C的成员变量、属性与带下划线属性的总结
- Objective-C Runtime 运行时之二:成员变量与属性
- Objective-C Runtime 运行时之二:成员变量与属性
- Objective-C Runtime 运行时之二:成员变量与属性
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
- Objective-C Runtime 运行时之二:成员变量与属性
- Objective-C Runtime 运行时之二:成员变量与属性
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
- Effective C++ 论基础
- 云中共享数据的公开校验——3.基于代理盲签名的身份隐私保护
- 详解ebs接口之客户配置文件导入(二)
- 利用Socket套接字通信
- 虚函数表
- Objective-C——属性与成员变量辨析
- Windows&Linux下进程间通信的方式
- chrome浏览器无法添加来自此网站的应用、扩展程序和应用脚本
- 判断mysql查询过程中是否用到了索引的方法:explain
- 电磁波的极化中一个易混淆的概念
- 杭电acm2012素数判定
- sobel算子
- 餐巾计划问题 费用流
- 阿里巴巴面试经历20140917