ios基础--内存案例
来源:互联网 发布:oa源码 java 编辑:程序博客网 时间:2024/05/22 00:28
assign:简单赋值,不更改索引计数(Reference Counting)。
copy到另外一个NSString之后,地址为0x2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说:retain是指针拷贝,copy是内容拷贝
222222222222222222222222222222222222222222222
strong类似于retain,引用时候会引用计算+1,weak相反,不会改变引用计数
在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
3333333333333333333333333333333333333333333333333
使用assign:对基础数据类型(NSInteger)和C数据类型(int ,float,double,char等)
使用copy:对NSString
使用retain:对其他NSObject和其子类。
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
Dog *_dog;
}
@property (retain) Dog *dog;
@end
person.m
#import "Person.h"
@implementation Person
@synthesize dog = _dog;
- (void) dealloc
{
NSLog(@"person is dealloc");
// 把人拥有的_dog释放
self.dog = nil;
[super dealloc];
}
@end
dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
int _ID;
}
@property int ID;
@end
dog.m
#import "Dog.h"
@implementation Dog
@synthesize ID = _ID;
- (void) dealloc
{
NSLog(@"dog %d is dealloc", _ID);
[super dealloc]; //dealloc必须要释放dog(retain)
}
@end
mian.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
// Person
// Dog.
// Person Dog.
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"Hello, World!");
Dog *dog1 = [[Dog alloc] init];
[dog1 setID:1];
Dog *dog2 = [[Dog alloc] init];
[dog2 setID:2];
Person *xiaoLi = [[Person alloc] init];
[xiaoLi setDog:dog1];
[xiaoLi setDog:dog2];
[dog1 release];
[xiaoLi release];
[dog2 release];
#if 0
Dog *dog1 = [[Dog alloc] init];
[dog1 setID:1];
Person *xiaoLi = [[Person alloc] init];
// 小丽要遛狗
[xiaoLi setDog:dog1];
Person *xiaoWang = [[Person alloc] init];
[xiaoWang setDog:dog1];
NSLog(@"dog1 retain count is %ld",
[dog1 retainCount]);
// dog1 retain count is 3
[dog1 release];
NSLog(@"dog1 retain count2 is %ld",
[dog1 retainCount]);
// dog1 retain count2 is 2
[xiaoWang release];
NSLog(@"dog1 retain count3 is %ld",
[dog1 retainCount]);
// person is dealloc
// dog1 retain count3 is 1
[xiaoLi release];
// person is dealloc
// dog 1 is dealloc
#endif
}
return 0;
}
assign,retain,copy
1、foo=value;//简单的引用赋值
2、foo=[value retain];//引用赋值,并且增加value的计数器
3、foo=[value copy];//将value复制了一份给foo,复制后,foo和value就毫无关系
111111111111111111111retain@class Dog
@property(nonatomic,retain) Dog *dog;
- (void) setDog:(Dog *)dog
{
if(_dog != dog){//判断是否需要重新赋值
[_dog release];//释放旧引用,计数器-1
_dog = [dog retain];//重新赋值,计数器+1
}
}
22222222222222222222222assign
@property(nonatomic,assign) int count
- (void)setCount:(int)count
{
_count =count
}
3333333333333333333333333333copy
@property (nonatomic,copy)NSString* str;
-(void)setStr:(NSString *)str
{
if(_str != str){//判断是否需要重新赋值
[_str release];//释放旧引用,计数器-1
_str = [str copy];//重新赋值,使用copy
}
}
=================================================================================
===========================================================================================
===================================================================================
copy和retain实例分析
@property(nonatomic,copy)NSString *str;
NSMutableString *s = [[NSMutableString alloc] setString:@"hello"];
p.str = s;//此时str的值为“”hello“”
[s sppendstring:@"world"]//此时,s的值为“”hello world“”,但str的值依然是“”hello“”
但是如果开始时str的申明为:
- ios基础--内存案例
- iOS内存管理基础
- ios基础---内存管理
- java基础学习日志--Stirng内存案例
- IOS 内存管理 案例篇 MBProgressHUD
- IOS基础UI之(七)综合小案例-猜图
- iOS基础——通过案例学知识之UITableView
- 【iOS】UI基础Day3-笔记(UIButton、购物车综合案例)
- 黑马程序员-IOS-OC基础-内存管理
- iOS学习笔记基础-oc06内存管理
- 黑马程序员-IOS-OC基础-内存管理
- iOS基础(c)-内存管理
- 黑马程序员---iOS基础---内存管理
- 黑马程序员---IOS基础---内存管理及内存分区
- C# 操作内存案例
- android内存溢出案例
- 内存经典案例分析
- 解决内存泄漏案例
- Android系统篇之—-Binder机制和远程服务调用机制分析
- ie9下checkbox无法二次全选
- ClipboardManager Hook总结
- windows + caffe + 配置python接口
- js常用方法
- ios基础--内存案例
- Linux常用命令行
- java中的break、continue、return区别
- IPC进程之间通信的几种方式
- 一个迷你音频播放器项目
- Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0(转)
- jsp中<jsp:forward page=""/>和response.sendRedirect("")两种跳转的区别
- bzoj1911[Apio2010] 特别行动队
- Node.js--Hello word!