您的位置:首页 > 编程语言 > C语言/C++

第05天OC语言(07):property修饰符

2017-07-16 00:00 274 查看
不要等到明天,明天太遥远,今天就行动。

#####须读:看完该文章你能做什么?

对property关键字的修饰符,深刻理解.对于修饰符的<底层原理>有一个深刻了解

#####学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

1.property关键字是用来干什么的,
2.synthesize关键字是用来干什么的
3.property在Xcode4.4之后都干了些什么

1.编译器只要看到 @property, 就知道我们要生成某一个属性的 getter/setter方法的声明
2.synthesize 是一个编译器指令,它可以简化 我们getter/setter方法的实现
3.从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现


#####一、本章笔记

 一、setter方法内存管理
     1.判断传入的对象 和当前的对象是否一样
     2.release 以前对象
     3.retain 传入的对象
 二、property关键字的修饰符
     readonly : 只会生成getter方法
     readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite
     getter : 可以给生成的getter方法 起一个名称
     setter : 可以给setter方法 起一个名称
     retain : 就会自动给我们 生成setter/getter方法 内存管理的代码
     assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign
         - (void)setAge:(int)age;
         - (int)age;
         - (void)setAge:(int)age
         {
            _age = age;
         }
         - (int)age
         {
            retrun _age;
         }
 多线程
         atomic : 性能低(默认)
         nonatomic : 性能高
         在iOS开发中 99% 都是些 nonatomic
 三、
    1.相同类型的property修饰符 不能同时使用
    2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开
    3.iOS开发 只要写上property ,那么就立刻写上 nonatomic

#####二、code
######main.m

#pragma mark 07-property修饰符
#pragma mark 概念
/*
 一、setter方法内存管理      1.判断传入的对象 和当前的对象是否一样      2.release 以前对象      3.retain 传入的对象  二、property关键字的修饰符      readonly : 只会生成getter方法      readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite      getter : 可以给生成的getter方法 起一个名称      setter : 可以给setter方法 起一个名称      retain : 就会自动给我们 生成setter/getter方法 内存管理的代码      assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign          - (void)setAge:(int)age;          - (int)age;          - (void)setAge:(int)age          {             _age = age;          }          - (int)age          {             retrun _age;          }  多线程          atomic : 性能低(默认)          nonatomic : 性能高          在iOS开发中 99% 都是些 nonatomic  三、     1.相同类型的property修饰符 不能同时使用     2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开     3.iOS开发 只要写上property ,那么就立刻写上 nonatomic */
#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];
    Room *r = [Room new];
    Car *c = [Car new];
    Dog *d = [Dog new];
    
    p.room = r;
    [r release];
    /*
    p.car = c;
    p.dog = d;
    
    
    [d release];
    [c release];
    [r release];
    [p release];
     */
    
#pragma mark setter方法内部的内存管理两种情况
// 换房了
// Room *r2 = [Room new];
// p.room = r2;
// [r2 release];

// 重复赋值
p.room = r;

/*
通过 是用retain的修饰符验证
retain 内部是这样做的
- (void)setRoom:(Room *)room
{

if (_room != room) {
[_room release];
_room = [room retain];
}
}
*/
    
    [p release];
    return 0;
}


######Person

>>>.h
#import <Foundation/Foundation.h>
#import "Room.h"
#import "Car.h"
#import "Dog.h"

@interface Person : NSObject
{
    Room *_room;
    Car *_car;
    Dog *_dog;
    
}
/*
- (void)setRoom:(Room *)room;
- (void)setCar:(Car *)car;
- (void)setDog:(Dog *)dog;

- (Room *)room;
- (Car *)car;
- (Dog *)dog;
*/

/*
 readonly : 只会生成getter方法
 readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite
 
 getter : 可以给生成的getter方法 起一个名称
 setter : 可以给setter方法 起一个名称
 
 retain : 就会自动给我们 生成setter/getter方法 内存管理的代码
 assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign
 - (void)setAge:(int)age;
 - (int)age;
 - (void)setAge:(int)age
 {
    _age = age;
 }
 - (int)age
 {
    retrun _age;
 }

 
 多线程
 atomic : 性能低(默认)
 nonatomic : 性能高
 在iOS开发中 99% 都是些 nonatomic
 */
//@property(retain) int age;

#pragma property 修饰符
//@property(retain) Room *room;
// 1.相同类型的property修饰符 不能同时使用
// 2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开
// 3.iOS开发 只要写上property ,那么就立刻写上 nonatomic
@property(nonatomic,retain) Room *room;

@end

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

@implementation Person
/*
 setter方法内存管理
 1.判断传入的对象 和当前的对象是否一样
 2.release 以前对象
 3.retain 传入的对象
 */

/*
- (void)setRoom:(Room *)room
{
    
    if (_room != room) {
        [_room release];
        _room = [room retain];
    }
}
- (void)setCar:(Car *)car
{
    if (_car != car) {
        [_car release];
        _car = [_car retain];
    }
}
- (void)setDog:(Dog *)dog
{
    if (_dog != dog) {
        [_dog release];
        _dog = [_dog retain];
    }
}

- (Room *)room
{
    return _room;
}
- (Car *)car
{
    return _car;
}
- (Dog *)dog
{
    return _dog;
}

*/
- (void)dealloc
{
    [_room release];
    [_car release];
    [_dog release];
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end

######Room

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

@interface Room : NSObject

@end

>>>.m
#import "Room.h"

@implementation Room
- (void)dealloc
{
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end

######Car

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

@interface Car : NSObject

@end

>>>.m
#import "Car.h"

@implementation Car
- (void)dealloc
{
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end

######Dog

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

@interface Dog : NSObject

@end

>>>.m
#import "Dog.h"

@implementation Dog
- (void)dealloc
{
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC语言