在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、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中的代码
View Code
#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
View Code
#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
View Code
#import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property int ID; @end Dog.m
View Code
#import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void) dealloc { NSLog(@"dog %d is dealloc", _ID); [super dealloc]; } @end main.m
View Code
#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; }
|
请发表评论