OC学习之property讲解

OC中的类分两个文件,.h用来声明类的变量和函数,.m文件负责实现,与.h配合使用。OC中最根本的类叫NSObject,OC是单继承的。

#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
    int _age;
}
@end

这样声明的变量是不能被外界访问的,因为该变量是被@protected修饰的。不管以什么形式访问,编译器都直接报错。

为了能够访问变量。给实例变量写设置器和访问器,即写变量的setter和getter方法。

HXStudent.h

#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
    int _age;
}
// 为了能访问age,声明了变量age的getter和setter方法
- (int)age;
- (void)setAge:(int)newAge;
@end
HXStudent.m

#import "HXStudent.h"
@implementation HXStudent
- (int)age {
    return <span style="color:#FF0000;">_age</span>;
}
- (void)setAge:(int)newAge {
    <span style="color:#FF0000;">_age</span> = newAge;
}
@end
setter和getter方法是公有方法。可以被外界访问。通过setter和getter方法间接访问变量。可以看出我们在类中可以直接 使用 _ 来访问变量本身。如下:

#import <Foundation/Foundation.h>
#import "HXStudent.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool { 
        [stu setAge:28];// 等价于stu.age = 28;
        int stuAge = [stu age];// int stuAge = stu.age;
        NSLog(@"stu age = %d", stuAge);
    }
    return 0;
}

这样我们就间接访问成员变量。OC中还支持点语法,该语法和对象调用成员变量的setter和getter方法相同,可见点语法就是调用变量的setter和getter方法。

           但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量大大增加。幸好从OC 2.0开始,我们能让系统自动生成设置变量值的方法或获取变量值的方法,即系统会自动为我们生成setter/getter方法。减少了代码量,让我们有更多的精力放在程序的业务逻辑上。

.h:@property为属性声明getter和setter方法

.m:@synthesize为属性实现getter和setter方法

如下:

HXStudent.h

#import <Foundation/Foundation.h>
@interface HXStudent : NSObject {
    int _age;
}
@property (nonatomic, assign) int age;
@end
HXStudent.m

#import "HXStudent.h"
@implementation HXStudent
@synthesize age = _age;
@end

我们来使用HXStudent类,如下:

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

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        
        HXStudent *stu = [[HXStudent alloc] init];
        stu.age = 28;
        
        int stuAge = stu.age;
        NSLog(@"stu age = %d", stuAge);
    }
    
    return 0;
}

可以看出,使用propertysynthesize声明变量,系统会帮我们自动生成变量的setter和getter方法,来间接访问变量。我们可以避免手工编写繁琐的setter 和 getter方法,节省编写代码的时间。

    @property 新的编译器指令,主要功能是为我们自动“生成”,setter和getter方法的声明。(注意:我们是看不到这些代码的)

    @synthesize与@property相对应的新的编译器功能。主要是为我们自动生成,setter和getter方法的功能实现。(注意:我们也不会看到相应的代码)

    我们也可以在HXStudent类中使用_来访问变量本身

    使用propertysynthesize再设置一些属性就能做一些内存管理方面的问题。手动生成的getter和setter只是简单的赋值和取值。手动的也可以管理内存方面的问题,但太过复杂。

    后来的OC就连synthesize也给省略了,在.h文件中直接使用property就能做到以上的功能。如下:

HXStudent.h

#import <Foundation/Foundation.h>

@interface HXStudent : NSObject
@property (nonatomic, assign) int age;
@end

HXStudent.m

#import "HXStudent.h"

@implementation HXStudent

@end

我们也在main函数中使用以下,如下:

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

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        
        HXStudent *stu = [[HXStudent alloc] init];
        stu.age = 28;
        
        int stuAge = stu.age;
        NSLog(@"stu age = %d", stuAge);
    }
    
    return 0;
}

用法还是没有变。可见使用property声明的量,系统会自动生成setter和getter方法。使用点语法就是调用变量的setter和getter方法。本文是在非ARC环境下讲解的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值