OC6_复合类的类存管理

//
//  Person.h
//  OC6_复合类的类存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

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

@interface Person : NSObject

@property (retain, nonatomic) Dog *dog;

@end

//
//  Person.m
//  OC6_复合类的类存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"%@:dog is release", [self class]);
   [_dog release];
    [super dealloc];
}

@end
//
//  Dog.h
//  OC6_复合类的类存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Dog : NSObject

@property (copy, nonatomic) NSString *name;
@property (assign,nonatomic) NSInteger age;

@end

//
//  Dog.m
//  OC6_复合类的类存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import "Dog.h"

@implementation Dog

- (void)dealloc
{
    NSLog(@"%@: dog name is release!!!", [self class]);
    [_name release];
    [super dealloc];
}

@end
//
//  main.m
//  OC6_复合类的类存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        //NSLog(@"Hello, World!");
        Person *xiaoHua = [[Person alloc] init];
        Dog *xiaoHei = [[Dog alloc] init];
        xiaoHei.name = @"小黑";
        //setter方法
        xiaoHua.dog = xiaoHei ;    //  [xiaoHei retain]
        NSLog(@"%li----",xiaoHua.retainCount);
        NSLog(@"xiao%li----",xiaoHei.retainCount);

      Person *p =[xiaoHua retain];
      // NSLog(@"xiaohei%li----",xiaoHei.retainCount);
      // NSLog(@"tt%li----",p.retainCount);
       //[xiaoHua release];

        NSLog(@"最后%li----",xiaoHei.retainCount);

        [xiaoHei release];
    }
    return 0;
}
时间: 2024-08-06 20:07:22

OC6_复合类的类存管理的相关文章

boost::serialization 用基类指针转存派生类(错误多多,一波三折)

boost::serialization 也支持c++的多态,这样我们就可以通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的例子来看: 基类和派生类的代码如下: class student_info { public: student_info() {} virtual ~student_info() {} student_info(const std::string& sn, const std::string& snm,

在普通类中获取Spring管理的bean

1.在项目中添加下面的类: import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. * */ public class SpringContextHolder implem

OC教程8-内存管理

OC8-内存管理 OC语言中的内存管理机制为ARC(Automatic Reference Counting,自动引用计数).与2011年中旬推出,替换陈旧且低效的手动内存管理,关于手动内存管理的内容,本章教程不在讲授.本章主要从以下几个方面对内存管理进行展开讲讲解. 内存管理原则 对象引用类型 属性引用类型 强引用循环 AUTO类型与释放池 1,内存管理原则 核心原则:没有被对象指针使用(指向)的内存立即释放.这个原则决定一般情况下,不会用内存泄露的情况存在,但存在特殊情况,也是本章最后一个专

RT-Thread--内存管理

内存管理的功能特点 RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法.总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存设备划分为三种情况: 第一种是针对小内存块的分配管理(小内存管理算法): 第二种是针对大内存块的分配管理(slab 管理算法): 第三种是针对多内存堆的分配情况(memheap 管理算法) 内存堆管理 内存堆管理用于管理一段连续的内存空间,如下图所示,RT-Thread 将 “ZI 段结尾处” 到内

IOS开发学习笔记013-内存管理

内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):static 变量,const变量,全局变量等 引用计数器  每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对象 每个OC对象内部专门有4个字节的存储空间来存储引用计数器  作用 当使用alloc.new或者copy创建一个新对象时,新对象的引用计数器默认就是1 当一

CWinApp类CMultiDocTemplate类CDocument类CView类的关系

转自:http://blog.csdn.net/bboot/article/details/26884011 不得不转,瞬间搞清了很多问题,短小精悍 1.CWinApp类   它包含并管理着应用程序的文档/视窗的所有信息.它有一个成员变量CDocManager*m_pDocManager,此变量是文档/视窗的管理器:m_templateList 是CDocManager里的一个列表,此列表里保存了所有文档模板的指针,当用户调用CWinApp::AddDocTemplate(pDocTemplat

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

动态类(类工厂)总结

动态类(类工厂)总结 一.动态类的作用 动态类应用的一个类似的例子便是MFC中CWnd类的Create方法,其第一个参数为Window Class的名字,这就允许用户通过class的名字来创建相应的窗口.C++不是动态语言,所以没法从语言机制上实现类的动态创建,但很明显这样的需求是存在的. 要想实现这一点,必须有一个“管理中心”,用于登记类的名字,并且通过名字能够调用某个方法来创建相应的类.结合类工厂的设计思想,这里我们让一套继承体系中的基类作为“管理中心”,由它来维护所有派生类的必要信息,包括

关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类

Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Mean类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功能会有多中表现形式, 例如:Eclipse中的"新建"功能,他会分别出现在主菜单,主工具栏,右键菜单里, 如果都是用MeanuItem来实现,就需要写三份代码,以后也要维护三份代码.当然也可以将时间处理 写成外部类来共享代码,但名称,图像以及一些其他的信息写成外部类来共享则不太方便. JF