OC2_引用计数

//
//  Dog.h
//  OC2_引用计数
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    NSString *_name;
    NSInteger _age;
}

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

@end

//
//  Dog.m
//  OC2_引用计数
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import "Dog.h"

@implementation Dog

@end
//
//  main.m
//  OC2_引用计数
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

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

//管理内存方式:
//自动引用计数 automic refence counting
//手动引用计数 manual refence counting

//gar --> automic refence counting  yes --> no

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *xiaoBai = [[Dog alloc] init];

        NSLog(@"retainCount = %li", xiaoBai.retainCount);

        //对对象进项保留, 增加对象的拥有权,使引用计数加1;
        //retain 的前提 是该对象存在

        Dog *xiaoHei = [xiaoBai retain];
        //Dog *xiaoHei = xiaoBai; 只是xiaohei的指针指向xiaobai ,并没有retainCount加1.
        NSLog(@"retainCount = %li", xiaoHei.retainCount);

        Dog *xiaoFei = [xiaoHei retain];
        NSLog(@"retainCount = %li", xiaoFei.retainCount);

        //release 释放对象拥有权, 引用计数器的值-1;
        [xiaoBai release];
        xiaoBai = nil;
        NSLog(@"retainCount = %li", xiaoFei.retainCount);

        [xiaoHei release];
        xiaoHei = nil;
        NSLog(@"retainCount = %li", xiaoFei.retainCount);

        [xiaoFei release];//retainCount = 0 dealloc
        xiaoFei = nil;
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
//        NSLog(@"今天天气不错, 就是下了点雨");
    //对象被释放之后, 不能再给对象发送消息
    // NSLog(@"retainCount = %li", xiaoFei.retainCount);
    }
    return 0;
}
时间: 2024-11-29 00:34:45

OC2_引用计数的相关文章

实现类似shared_ptr的引用计数

13.27 定义使用引用计数版本的HasPtr #include<iostream> #include<string> #include<new> using namespace std; class HasPtr { public: HasPtr(const string &s=string()):ps(new string(s)),i(0),use(new size_t(1)) {cout<<"constructer"<

深拷贝&amp;浅拷贝&amp;引用计数&amp;写时拷贝

(1).浅拷贝: class String { public: String(const char* str="") :_str(new char[strlen(str)+1]) { strcpy(_str,str); } ~String() { if(NULL!=_str) { delete[] _str; _str=NULL; } } private: char* _str; }; int main() { String s1("hello"); String

手工引用计数中规则

使用设值方法为属性赋值时 assign.retain.copy三个特性的实现 self.property = newValue; assign的特性会是这样: property = newValue; retain特性会是这样 if (property!=0) { [property release]; property = [newValue retain]; } copy的特性会是这样 if (property!=0) { [property release]; property = [ne

Objective-C中的引用计数

导言 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器.如果想使某个对象继续存活,那就递增其引用计数:用完了之后,就递减其计数.计数为0,就表示没人关注此对象了,于是,就可以把它销毁. 从Mac OS X 10.8开始,“垃圾收集器”(garbage collector)已经正式废弃了,以Objective-C代码编写Mac OS X程序时不应再使用它,而iOS则从未支持过垃圾收集.因此,掌握引用计数机制对于学好Objective-C来说十分重要.

引用计数

在引用计数中,每一个对象负责维护对象所有引用的计数值.当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减.当引用计数到零时,该对象就将释放占有的资源.中文名引用计数原 因程序调试原 理每一个对象负责维护对象所有引用的计数值类 型最直观的垃圾收集策略目录1简介2引用计数的使用? 原因? 规则? 接口? 调试? 优化? 规则1简介编辑 最直观的垃圾收集策略是引用计数.引用计数很简单,但是需要编译器的重要配合,并且增加了赋值函数 (mutator) 的开销(这个术语是针对用户

基于引用计数的智能指针

编程语言中实现自动垃圾回收机制方式有好几种,常见的有标记清除,引用计数,分代回收等. C++需要手动管理垃圾,可以自己实现一个智能指针.最简单的是引用计数的思路 template <class T> class SmartPointer { T* obj; unsigned int* count; SmartPointer(T* ptr) { obj = ptr; count = new int; *count = 1; } SmartPointer(SmartPointer &p)

ARC自动引用计数

启动自动引用计数选项. 选择项目的属性文件 --> 搜索 automatic Reference --> Objective-C Automatic Reference Counting --> Yes ARC 和手动管理内存的区别. ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存.而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码. 开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super deal

netty的引用计数

netty的引用计数文档看http://netty.io/wiki/reference-counted-objects.html 为什么会引用引用计数呢,Java中不是有gc线程帮我们回收对象吗?我个人理解如下 1:netty为了实现zero copy使用了Direct Buffer,该buffer从Native Memory分配出来,分配和回收效率要远低于在Java Heap上的对象,所以一般full gc来控制的,直接内存会自己检测情况而调用system.gc(),通过使用引用计数可以自己来

智能指针的实现--使用引用计数实现以及原理

一.智能指针 在C++语言编程时,当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副本而创建时,拷贝