object-c的Retain and Release(保留与释放)
发布日期:2021-05-15 16:23:58 浏览次数:12 分类:精选文章

本文共 1529 字,大约阅读时间需要 5 分钟。

在Object-C中,系统会自动为每个对象管理引用计数器。每当创建新对象时,初始计数设置为1。为了保持对对象的引用,需要通过调用retain()方法来增加计数,需要调用release()方法来减少计数。当计数为0时,系统会自动发送dealloc()消息释放对象的内存。

代码示例

1. ClassA.h

#import 
@interface ClassA : NSObject@end

2. ClassA.m

#import "ClassA.h"@implementation ClassA- (void) dealloc {  printf("Deallocing ClassA\n");  [super dealloc];}@end

3. main.m

#include 
#include "ClassA.h"int main(int argc, const char *argv[]) { printf("test case 1:\n"); ClassA *a1 = [[ClassA alloc] init]; ClassA *a2 = [[ClassA alloc] init]; printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); printf("test case 2:\n"); [a1 retain]; // 2 [a1 retain]; // 3 [a2 retain]; // 2 printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); printf("test case 3:\n"); [a1 release]; // 2 [a2 release]; // 1 printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); [a1 release]; // 0 [a2 release]; // 0 printf("Deallocing ClassA\n"); printf("Deallocing ClassA\n"); return 0;}

编译运行

gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headersgcc -c ClassA.m -I /GNUstep/System/Library/Headersgcc main.o ClassA.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base./main.exe

说明

  • 引用计数的管理规则
    • 每有一个retain(),需要一个release()
    • dealloc()只会被调用一次,释放持有对象的内存。
  • 内存管理原则
    • 只有由你申请的内存才需你负责释放,不能随意释放他人分配的内存。
  • 合理使用retainautoRelease
    • 在使用retain()时,尽量使用autoRelease来减少留oblinance。
  • 上一篇:object-c的Dealloc
    下一篇:object-c的protocol(协议)

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月09日 13时48分40秒