oc知识点 内存高级

一属性的内存管理

1属性的语义特征

①assign 基本数据类型(char,short,int,float,double)

<1>最开始使用的set get方法的实现

@property (nonatomic, assign) NSIntger age;
set
     - (void)setName:(NSIntger)age {
       _age = age;
}
get
     - (NSIntger)age {
         return _age;
}

<2>修改后的代码

set
- (void)setName:(NSIntger)age {
   _age = age;
}
get
- (void)setName:(NSIntger)age {
    [_age release];
    _age = [age retion];

②retain 对象类型

@property (nonatomic, retain) NSString *name;
set
     - (void)setName:(NSString *)name {
         if (_name != name) {
             [_name release];
             _name = [name retain];
         }
}
get
     - (NSString *)name {
         return [[_name retain] autorelease];
}

③copy 对象类型,且遵循了<NSCopying>协议的

@property (nonatomic, copy) NSString *name;
set
    - (void)setName:(NSString *)name {
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
}
get
    - (NSString *)name {
        return [[_name retain] autorelease];
}

如果要对一个对象进?行copy操作,那该对象所属的类必 须遵守<NSCopying>协议

二dealloc释放那个实例变量

1dealloc是NSObject的一个实力方法,用于回收alloc开辟的内存空间

2这个方法在对象引用计数为0时,由系统自动调用

3通常我们在dealloc中释放类的实例变量

修改前(void)dealloc {
    [super dealloc];
}修改后
- (void)dealloc {
    [_name release];
    [super dealloc

注意  永远不要手动调用dealloc

在dealloc方法的最后一行必须要写【super dealloc】,让系统真正去销毁对象

三便利构造器的内存管理

+ (id)personWithName:(NSString *)name {
    Person *p = [[Person alloc] initWithName:name];
    return p;
}

现在考虑p该如何释放?

+ (id)personWithName:(NSString *)name {
Person *p = [[Person alloc] initWithName:name]; r[epturn [p autorelease];
} [p }

四集合的内存管理

1常见集合 NSArray NSDictionary ,NSSet

2集合会自主管理集合内部的元素

集合内存的管理方式:

①加入集合的元素会被retain

②移除集合的元素会被release

③集合被释放时会堆积和中所有元素release;

五KVC

1 kvc ;key Value Coding 键值编码 ,是一种间接访问器方法

2KVC 中常见的方法:

- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValuesForKeysWithDictionary:(NSDictionary
*)keyedValues

虽然提供了这些方法但是对于想获取信息的时候也可以直接使用get方法

注意:当使用KVC时,如果key值和属性名不一样时就会放生程序运行崩溃

//如果是用kvc赋值,一定要重写这个方法,这个方法可以什么都不写,作用防止找不到key而崩溃

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    //NSLog(@"++=%@:%@",key,value);
}

或者

- (id)valueForUndefinedKey:(NSString *)key {
}

六ARC

1ARC 自动引用计数,由开发者开辟内存空间,但事实不需要释放内存空间,由系统自动释放空间

2ARC本质还是基于MRC的,只不过是系统自动添加了释放内存的方法

3ARC 是编译器特性,而不是运行时特性,更不是垃圾回收器

ARC的注意事项

1当工程开启ARC后由于编译器会自动帮你释放内存,所以和内存有关的操作retain release autorelease 都不能写

2当重写dealloc方法时 也不能写【super dealloc】,否则会报错

语意特性

① assign 基本数据类型

② strong 对象类型,相当于MRC中的retain

③ copy 对象类型 ,且遵守了<NSCopying>协议

④ weak 对象类型 ,但是内部不会对对象做retain的操作

ARC 与MRC的混编

如果需要对特定?文件开启或关闭ARC,可以在?工程选项中选择

Targets -> Compile Phases -> Compile Sources,在?里?面找到对应?文 件,添加flag:

打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc
时间: 2024-11-12 23:22:13

oc知识点 内存高级的相关文章

oc知识点总结

类的基本概念 类:具有相同特征和相同行为的事物的抽象 类是一个抽象的概念,在生活中不具体 对象,是类的实例,也就是类的具体体现,是具体的,生活中的万物都是对象 类的接口部分的定义,写在.h文件中 方法声明: 如 - (void)"方法返回类型"  say "方法名" :(NSInteger)"参数类型" x "参数名" y "参数名":(NSInteger)"参数类型" y"参

黑马程序员——OC的内存管理概述

内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NSObjective的对象,对基本数据类型是无效的.这和它的管理原理有关. 每个对象内部都保存了一个与之关联的整数,称为引用计数器,当使用alloc.new.或copy创建一个对象时,对象的引用计数器被设置为1.给对象发送一条retain信息,可以使引用计数器的值加1,给对象发送一条release信息

iOS开发OC基础:OC的内存管理

OC内存管理的基础知识 /** //             *  当对一个对象autorelease时,会将该对象放到离它最近的自动释放池,当自动释放池将要销毁时,会对自动释放池中的对象发送release消息,让对象的引用计数减1,(切记,是将对象的引用计数减1,而不是回收空间.) //             */ /** *  如果相对一个对象做copy操作,就必须让该类服从NSCopying协议,并且实现协议中的- (id)copyWithZone:(NSZone *)zone方法 */

OC的内存管理机制

总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:retaincount 从英文字面上理解就是在这种机制下,内存需要程序员去手动管理,即通过在代码中调用-retain.-release或者-autorelease去增加和减小对象的引用计数,当引用计数为0时,对象会自动调用-dealloc方法释放所占用的内存. 2.垃圾回收机制(Garbage Collec

OC 知识点回顾

/* 字符串: NSString  不可变字符串  字符串对象的内容不能修改,字符串的指针可以改变 NSMutableString 可变字符串   可以修改字符串对象的内容,继承自NSString ,具有所有的方法 */ 1.创建对象,实例方法和类方法 NSMutableString *mStr=[[NSMutableString alloc]initWithString:@"Hello World"]; 2.将不可变字符串转换为可变字符串 NSMutableString *mStr2

OC语言--内存管理

1.内存管理原理的介绍 1.1C的内存管理 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. strcpy(p,"Hello World!"); 将字符串拷贝给指针变量p指向的内存空间. puts(p); 将p指针指向的内存空间里的字符串打印出来. free(p); 使用完成后,手动跟系统释放内存空间:或

(Object-C)学习笔记(三) --OC的内存管理、封装、继承和多态

OC的内存管理 iOS7以前使用的是MRC手动内存管理,现在都使用ARC自动内存管理,一般不会出现内存泄漏问题. 封装 封装就是有选择的保护自己的代码.将给别人使用的接口留出来让人看见,其他的都隐藏起来.增加了代码的可读性.可维护性.可拓展性. 将给别人看的代码放在 interface当中(.h or .m),不让看的放在implementation当中.这就是封装对象. 继承 子类可以继承父类非私有的属性和方法. 继承的优点:1.代码复用 2.制定规则 3.为了多态 继承的缺点:1.提高了代码

收集的一些OC知识点

bool 即是 signed char,在iphone64位是unsigned char 收集的一些OC知识点,布布扣,bubuko.com

OC基础 内存管理

OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free(p); c语言内存管理存在的缺陷: (1)不释放就会造成内存泄露. (2)多次释放就会造成崩溃. (3)大型项目中多人对一块内存进行操作时,不能释放内存,因为不知道别人是否还在使用. oc语言的内存管理 1.内存管理 (1)引用计数. (2)内存管理的黄金法则:谁创建谁释放. 让我们来看一下测试例