oc46--nonatomic, retain

简介:
复制代码
//
//  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;
 */
@property(nonatomic, retain) Room *room;//标准写法都是(nonatomic, retain)


/*
 写了retain就可以生成:
 - (void)setRoom:(Room *)room
 {
     // 1.判断传入的对象和当前对象是否一样
     if (_room != room) {
         // 2.release以前的对象
         [_room release];
         // 3.retain传入的对象
         _room = [room retain];
     }
 }
 */





/*
 readonly: 只会生成getter方法
 readwrite: 既会生成getter也会生成setter, 默认什么都不写就是readwrite
 
 getter: 可以给生成的getter方法起一个名称
 setter: 可以给生成的setter方法起一个名称
 
 retain: 就会自动帮我们生成getter/setter方法内存管理的代码,上次44,45的内容
 assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法, 默认什么都不写就是assign。
 
 
 多线程
 atomic :性能低(默认)
 nonatomic :性能高
 在iOS开发中99.99%都是写nonatomic,因为手机性能低。 atomic用于pc开发中。
*/
@end
复制代码
复制代码
//
//  Person.m


#import "Person.h"

@implementation Person

/*
- (void)setRoom:(Room *)room
{
    // 1.判断传入的对象和当前对象是否一样
    if (_room != room) {
        // 2.release以前的对象
        [_room release];
        // 3.retain传入的对象
        _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
复制代码
复制代码
//
//  main.m
//  property修饰符

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

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;
//    p.car = c;
//    p.dog = d;
    
//    [d release];
//    [c release];
//    [r release];
//    [p release];
     */
    
    p.room = r;
    [r release];
    
    
    // 换房了, 如果set方法中没有release旧值, 就会内存泄露
    Room *r2 = [Room new];
    p.room = r2;
    [r2 release];
    
    
    // 重复赋值
    p.room = r;
    
    [p release];
    return 0;
}
复制代码

 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7427849.html,如需转载请自行联系原作者

相关文章
|
7月前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
294 6
从零开始:用Python爬取网站的汽车品牌和价格数据
|
7月前
|
数据采集 并行计算 数据可视化
Pandas高级数据处理:数据报告生成实战指南
数据报告生成面临数据质量、计算性能、呈现形式和自动化等核心挑战。常见问题包括缺失值导致统计失真、内存溢出及可视化困难。解决方案涵盖数据清洗、分块处理、安全绘图模板等。通过模块化设计、异常处理机制和性能优化策略,如使用`category`类型、并行计算等,可大幅提升效率。最佳实践建议建立数据质量检查清单、版本控制和自动化测试框架,确保系统具备自适应能力,提升报告生成效率300%以上。
151 12
|
9月前
|
人工智能 自然语言处理 运维
阿里云多模态数据信息提取技术解决方案评测
阿里云多模态数据信息提取技术解决方案,利用先进AI技术处理文本、图像、音频和视频,帮助企业从海量数据中高效提取有价值信息。方案涵盖文本、图片、视频信息提取,适用于电商平台、安防等领域。通过大模型支持自动扩展与持续训练,提供简单部署及免费试用,评测显示其在识别准确性和易用性方面表现出色,但仍需优化高级设置提示和加载速度。
|
分布式计算 Spark 大数据
深入探究Apache Spark在大数据处理中的实践应用
【6月更文挑战第2天】Apache Spark是流行的开源大数据处理框架,以其内存计算速度和低延迟脱颖而出。本文涵盖Spark概述、核心组件(包括Spark Core、SQL、Streaming和MLlib)及其在数据预处理、批处理分析、交互式查询、实时处理和机器学习中的应用。通过理解Spark内部机制和实践应用,可提升大数据处理效率,发挥其在各行业的潜力。
|
关系型数据库 MySQL 大数据
DataX:数据同步的超音速英雄!阿里开源工具带你飞越数据传输的银河系,告别等待和故障的恐惧!快来见证这一数据工程的奇迹!
【8月更文挑战第13天】DataX是由阿里巴巴开源的一款专为大规模数据同步设计的工具,在数据工程领域展现强大竞争力。它采用插件化架构,支持多种数据源间的高效迁移。相较于Apache Sqoop和Flume,DataX通过并发写入和流处理实现了高性能同步,并简化了配置流程。DataX还支持故障恢复,能够在同步中断后继续执行,节省时间和资源。这些特性使其成为构建高效可靠数据同步方案的理想选择。
780 2
|
机器学习/深度学习 人工智能 自然语言处理
人工智能、机器学习、深度学习:技术革命的深度解析(一)
人工智能、机器学习、深度学习:技术革命的深度解析(一)
315 0
|
物联网 5G 数据处理
|
监控 NoSQL 测试技术
MongoDB性能最佳实践:如何制定更有效的基准测试?
感谢你与我们一起走过这段MongoDB性能最佳实践之旅,希望你能从中获取一些有用的信息
2183 3
|
网络协议 算法
【MODBUS】Modbus的3种传输方式
【MODBUS】Modbus的3种传输方式
355 1
|
SQL 存储 监控
构建端到端的开源现代数据平台
构建端到端的开源现代数据平台
599 4