第04天OC语言(04):property增强

  • 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?

你能知道property内部做了什么事情
1> 生成setter方法、getter方法
2> 在内部生成一个私有的变量(_成员变量)
3> 和@synthesize age有区别 ,@synthesize age;直接赋值给age

学习前:你必须会什么?

了解什么是封装。


一、本章笔记
 一、
     从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
     没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
     
     @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
     如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
     如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
     
     如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
     注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
 二、
     如果重写了setter方法,那么property就只会生成getter方法
     如果重写了getter方法,那么property就只会生成setter方法
     如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
 三、注意:
     系统 和 @synthesize 有点区别
     系统直接赋值给 _age
     而使用 @synthesize age; 系统 则会赋值给 age;
二、code
main.m
#pragma mark 04-property增强
#pragma mark 概念
/*
 一、
     从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
     没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
     
     @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
     如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
     如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
     
     如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
     注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
 二、
     如果重写了setter方法,那么property就只会生成getter方法
     如果重写了getter方法,那么property就只会生成setter方法
     如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
 三、注意:
     系统 和 @synthesize 有点区别
     系统直接赋值给 _age
     而使用 @synthesize age; 系统 则会赋值给 age;
 */
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
    Person *p = [Person new];
    [p setAge:25];
//    NSLog(@"age = %i",[p age]);
#pragma 验证系统赋值给那个age? _age?
    /*
     注意:
     系统 和 @synthesize 有点区别
     系统直接赋值给 _age
     而使用 @synthesize age; 系统 则会赋值给 age;
     */
//    NSLog(@"age = %i, _age = %i",p->age,p->_age);
//    p->_age
    return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
/*
{
    @public
    int _age;
    int age;
}
 */

#pragma @property增强
/*
 从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
 没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
 
 @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
 如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
 如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
 
 如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
 注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
 */
/*
 - (void)setAge:(int)age;
 - (int)age;
 */


// 这里不知道赋值给 同名的age 还是 _age?
@property int age;
@end

>>>.m
#import "Person.h"

@implementation Person

/*
 {
    int _age;
 }
 - (void)setAge:(int)age
 {
    _age = age;
 }
 - (int)age
 {
    _age = age;
 }

 */

/*
 如果重写了setter方法,那么property就只会生成getter方法
 如果重写了getter方法,那么property就只会生成setter方法
 如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
 */
- (void)setAge:(int)age
{
    if (age < 0) {
        age = 0;
    }
    _age = age;
}
@end
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Ⅰ 以前我写过一篇文。说我为什么养不了动物。我说因为我以前养的一只狗死了。让我有心理阴影。现在看来那或许只是借口,...
    我叫正经阅读 420评论 0赞 0
  • 【日常】 胃不好 也是常有的事了 前不久半夜爬起来去厕所里面吐 直犯恶心 也吃不下东西 跟朋友感慨真的是年纪大了经...
    薛定谔的猫的树阅读 408评论 0赞 0
  • 1.1 Linux C语言结构体 简介:本课程深入的讲解了C语言中,预处理是怎么回事,结构体和公用体又是如何使用及...
    小白教你学Cplusplus阅读 388评论 0赞 0

友情链接更多精彩内容