Objective-C——属性与成员变量辨析

        上篇中提过,成员变量是在一对大括弧里面声明的;而属性是用先@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);
}
@end
main.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.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值