c语言arc函数带几个参数,ARC的使用简要总结

更新时间:2023-05-07 13:11:59 阅读: 评论:0

c语⾔arc函数带⼏个参数,ARC的使⽤简要总结
.h⽂件中:
1,@property (strong,nonatomic)中属性的定义主要是类对外的接⼝,将retain,copy等变为strong。
2,私有变量
.m⽂件中的类扩展定义的私有属性变量,即@interface class (){@property()nsarray *
array;}
现在直接在类实现中@implementation class{ nsarray *
array;}即可----附:此处仍然可以lf.array来访问。
3,outlet
除了files owner(链接nib顶层对象⽤strong)之外,均⽤weak。
优势:unload中,不需要lf.outlet=nil;了。
附:当接受到内存警告时,ViewCtl的mainView会unload,释放其所有subView。但是需要设置所有⾮outlet变量为nil。
4,strong=retain,weak(outlet多⽤),unsafe_unretained=assign(IOS4适⽤),copy=copy+strong,assign(原始类型
BOOL,int,CGFloat等),readonly要+strong,iddelegate⽤weak,nonatomic,block⽤copy。
5,在.m⽂件中,移除所有的autorelea,retain,relea调⽤。
诸如:lf.XX=[[[mainVC
alloc]init]autorelea];现在改为:lf.XX=[[mainVC alloc]init]即可。
6,dealloc{},移除所有relea⽅法,【super
dealoc】;其他资源如定时器,CF对象时才需要之。CFReal等。作⽤:1,移除监听;2,取消注册通知;3,将non-weak
delegate设置为nil;4,invalidate
timers。
7,@autoreleapool⽤法:
if someArray很⼤
for(id obj in
someArray)
{
@autoreleapool
{
//假如你创建了许多中间临时变量在此处
}
}
8,某个项⽬中若设置某个⽂件不使⽤arc,⽅法:在Build Phas -> Compile sources,选择需要的⽂件,在右边Compile Flags输⼊-fno-objc-arc
启⽤arc:-fobjc-arc
9,Blocks:主要在于blocks中的循环参照问题。
a,block在属性定义的时候,使⽤copy。
调⽤端如下:
MyObject *object = [[MyObject alloc] init]; object.str = @"hoge"; object.block = ^{NSLog(@"block:
str=%@", object.str); }; [object performBlock];
由上可知:object和block构成了循环参照,如图:
解决办法:
1,使⽤__block修饰---
使⽤__block关键字,让对象有读写权限,如果Block内的处理完毕就释放object。
__block MyObject *object = [[MyObject alloc] init]; object.str = @"hoge"; object.block= ^{ NSLog(@"block:
str=%@", object.str); object = nil; }; [object performBlock];
关键字的意思就是让block取消对object的强参照,以避免循环参照。但是,有⼀个问题就是,object的释放动作是在Block内部执
⾏,如果Block没有被执⾏的话,循环参照⼀直存在。⽐如上⾯的代码,如果第8⾏ [object performBlock];
没有执⾏的话,那么⼀直还是循环参照状态。
使⽤__weak关键字修饰
另⼀种⽅案就是让Block的参照变为弱参照。
MyObject *object = [[MyObject alloc] init]; object.str = @"hoge"; __weak MyObject*weakObject = object; object.block = ^{ NSLog
str=%@", weakObject.str); };[object performBlock];
考虑到异步通信时Blocks的使⽤情况,weak变量weakObject有可能随时变为nil,所以类似于下⾯先变为strong变量,并检查是否为nil的
处理⽅式应该更安全。
MyObject *object = [[MyObject alloc] init]; object.str = @"hoge"; __weak MyObject*weakObject = object; object.block = ^{ MyObj
str=%@", strongObject.str); } }; [objectperformBlock];
总上,当我们使⽤Blocks时,也需要考虑Block中变量和实例的关系,不要引起不必要的循环参照问题。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
以下未细化:
⼿动下的情况:
1,凡⽤alloc/new/copy/mutableCopy,则⽣成对象并拥有其所有权;
2,retain-拥有对象所有权,relea-释放对象所有权,dealloc-释放对象资源。
3,变成准则:
⽣成对象时,使⽤autorelea-->返回对象即return [[object retain]
autorelea];
- (void)tMember:(TempValue *)value {
[_member autorelea];
_member = [value retain];
}
ARC开启:
1,指针在,obj就在。
2,⽗Var-->⼦Var :strong引⽤;⼦Var-->⽗Var :Weak引⽤
3,在⼿动惯例内存时,⼀旦obj⾃array中remove后,obj便会销毁。但在ARC中,obj拥有该值的strong引⽤--
{id obj = [array objectAtIndex:0];
[array removeObjectAtIndex:0];
NSLog(@"%@", obj);
}
ARC规则:
1,不能使⽤NSAutoReleaPool、⽽需要@autoreleapool块
2,retain, relea,
autorelea, dealloc由编译器⾃动插⼊,不能在代码中调⽤,
dealloc虽然可以被重载,但是不能调⽤[super dealloc]。
引⽤关键字:
1,strong, weak,
autoreleasing限定的变量会被隐式初始化为nil。
2,_strong:(缺省)
3,_weak
4,_unsafe_unretained:其修饰的,当⽆所有者时,其不⾃动指向nil。
5,_autoreleasing:该关键字使对像延迟释放。⽐如你想传⼀个未初始化的对像引⽤到⼀个⽅法当中,在此⽅法中实例化此对像,那么这种情况可以使⽤__autoreleasing。他被经常⽤于函数有值参数返回时的处理.
例:- (void)
generateErrorInVariable:(__autoreleasing NSError
**)paramError
{ ....
*paramError =
[[NSError alloc] initWithDomain:@"MyApp" code: 1urInfo:errorDictionary];
}
应⽤
[lfgenerateErrorInVariable:&error];
NSLog(@"Error = %@", error); }
-----------------------------------------
函数的返回值是在函数中申请的,那么希望释放是在调⽤端时:
例:-(NSString
*)stringTest
{ NSString *retStr = [NSString
stringWithString:@"test"];
return [[retStr
retain] autorelea];
}
// 使⽤ARC
-(NSString *)stringTest
{
__autoreleasing NSString *retStr =
[NSString alloc]  initWithString:@"test"];
returnretStr;
}
即当⽅法的参数是id*,且希望⽅法返回时对象被autorelead,那么使⽤该关键字。
----
基本的ARC使⽤规则
代码中不能使⽤retain, relea,
retain, autorelea
不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调⽤[super dealloc])
不能使⽤NSAllocateObject,
NSDeallocateObject
不能在C结构体中使⽤对象指针
id与void *间的如果cast时需要⽤特定的⽅法(__bridge关键字)
不能使⽤NSAutoReleaPool、⽽需要@autoreleapool块
不能使⽤“new”开始的属性名称 (如果使⽤会有下⾯的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)
----
ARC之@property
关键字
所有权
strong
__strong
weak
__weak
unsafe_unretained
__unsafe_unretained
copy
__strong
assign
__unsafe_unretained
retain
__strong
1,weak:delegate和IBOutlet⽤该属性来声明
2,assign:⼀般数据变量,BOOL
3,unsafe_unretained等价weak。
4,readwrite和readonly-----需要类似@property (nonatomic, strong, readonly) NSString *name; typedef void(^MyBlock)(void);
@interface MyObject :
NSObject
@property (nonatomic,copy) MyBlock
block;
@property (nonatomic, strong) NSString
*str;
-(void)performBlock;

本文发布于:2023-05-07 13:11:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/865646.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   变量   参照   循环   属性
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图