一、retain属性的主要作用
1、O-C内存管理和点语法
1>OC内存管理正常情况要使用大量的retain和relrese操作
2>点语法可以减少使用retain和release的操作
二、@property(retain)编译器如何申明
编译器对于@property中的retain展开是不一样的
主要是要释放上一次的值,增加本次计数器
在dog.h中声明的:
@property(retain)Dog *dog;
展开后为:
-(void) setDog:(Dog *)aDog;
-(Dog *)dog;
三、@synthesize编译器如何实现展开
在dog.m中实现:
@synthesize dog=_dog;
展开后为:
-(void) setDog:(Dog *)aDog{
if(_dog!=aDog){
[_dog release];
_dog=[aDog retain];
}
}
-(Dog *)dog{
return _dog;
}
四、dealloc需要注意内容
dealloc必须要释放dog(retain)
在dog.m中
-(void) dealloc
{
self.dog=nil;
[super dealloc];
}
五、copy属性的主要作用
copy属性是完全把对象重新拷贝了一份,计数器从新设置为1,和之前拷贝的数据完全脱离关系。
@property(copy) NSString* str;
//表示属性的getter函数
-(double) str
{
return str;
}
//表示属性的setter函数
-(void) setStr:(NSString *)newStr
{
str=[newStr copy];
}
六、assign,retain,copy
1、foo=value;//简单的引用赋值
2、foo=[value retain];//引用赋值,并且增加value的计数器
3、foo=[value copy];//将value复制了一份给foo,复制后,foo和value就毫无关系
Person.h中的代码

#import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject { Dog *_dog; } //- (void) setDog:(Dog *)aDog; //- (Dog *) dog; @property (retain) Dog *dog; @end
Person.m

#import "Person.h" @implementation Person @synthesize dog = _dog; //- (void) setDog:(Dog *)aDog //{ // if (aDog != _dog) { // [_dog release]; // // _dog = [aDog retain]; // //让_dog技术器 +1 // } //} //- (Dog *) dog //{ // return _dog; //} - (void) dealloc { NSLog(@"person is dealloc"); // 把人拥有的_dog释放 //[_dog release], _dog = nil; self.dog = nil; //[self setDog: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]; } @end
main.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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库