一.複習內存管理中的MRC(手動管理內存)學習
1.仍是遵循誰retain,誰release的原則;atom
2.遛狗練習的中途換狗問題,在person的.m文件中重寫setdog方法spa
- (void) setDog:(Dog *)dog{.net
//DogA 計數器 - 13d
[_dog release];指針
//當前溜的DogBcode
_dog = dog;orm
//DogB 計數器 + 1對象
[_dog retain];內存
}
3.關於retainCount爲1,-1,0,無窮大的條件
(1)爲1時 是對象計數 當建立對象時或者對象即將釋放時爲1,即對象計數器最小爲1.
(2)爲0時 當一個指針的值爲空時。
(3)爲-1或無窮大時 當一個數據類型被賦值時。
不可變對象一般被稱爲靜態常量,這類對象通常不能用於計數,而可變的對象是能夠用來計數的
二.學習了淺拷貝和深拷貝
1.淺拷貝 copy 一般指針對於指針進行拷貝,特色爲:經過多個指針指向同一片內存地址。
如 NSString *string = @"123";
NSString *stringI = [string copy];
這時string和stringI輸出的內存地址相同
2.深拷貝 mutableCopy 指的是賦值內容而且從新建立一塊內存地址
如 NSString *stringII = [string mutableCopy];
這時string和stringII輸出的內存地址不相同
三.自動釋放池(autorelease)
1.autorelease一般有做用域,當在做用域範圍內的建立特定的對象時,出去做用域計數器就會-1
如 @autorelease{
Person *personP = [[Person alloc]autorelease];
//特定的autorelease建立的對象纔在出去做用域的時候release 計數器 -1
此時也能夠在做用域裏面對person retain或release,可是無論怎樣,出做用域時計數器只會減y一
}
四.ARC(自動引用計數)
1.ARC會追蹤你的對象並決定哪個仍會使用而哪個不 會再用到
• 若是啓用了ARC,編譯器會自動插入retain和release 語句
• 經過Xcode啓用或禁用可
2.ARC的特色
(1)不容許調用release,retain,retainCount
(2)容許重寫dealloc,可是不容許調用[super dealloc]
(3)@property的參數:
• strong:至關於原來的retain(適用於OC對象),成員變量是強指針
• weak:至關於原來的assign,(適用於OC對象類型),成員變量是弱指針
• assign:適用於非OC對象類型(基礎類型)
相互引用時注意的問題:
1.在一方的.h文件中要導入另外一方的頭文件,另外一方的.h文件要引用@class name
如 #import <Foundation/Foundation.h>
#import "MicroBlog.h"
@interface Person : NSObject
#import <Foundation/Foundation.h>
@class Person;
@interface MicroBlog : NSObject
2.一方使用強指針,另外一方使用弱指針
3.引用@class的一方若要在.m文件中實現相應的方法,要在.m文件中再次導入另外一方的頭文件
如 #import "MicroBlog.h"
#import "Person.h"
@implementation MicroBlog
ARC實例:
person.h
#import <Foundation/Foundation.h>
#import "MicroBlog.h"
@interface Person : NSObject
@property (nonatomic ,strong)MicroBlog *microBlog;
@property (nonatomic,strong) NSString *name;
@property (nonatomic,weak) NSString *comment;
-(void)printf;
@end
person.m
#import "Person.h"
@implementation Person
-(void)printf
{
NSLog(@"%@在%@發佈了第%i條微博,內容是:%@",_name, [_microBlog time],[_microBlog second],[_microBlog content]);
}
@end
microBlog.h
#import <Foundation/Foundation.h>
@class Person;
@interface MicroBlog : NSObject
@property(nonatomic,weak) Person *person;
@property(nonatomic,weak) Person *commentPerson;
@property(nonatomic,weak) NSString *content;
@property(nonatomic,weak) NSString *time;
@property(nonatomic,assign) int second;
-(void)printComment;
@end
microBlog.m
#import "MicroBlog.h"
#import "Person.h"
@implementation MicroBlog
-(void)printComment
{
NSLog(@"%@評論了你的微博:%@",[_commentPerson name],[_commentPerson comment]);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "MicroBlog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *person = [[Person alloc]init];
person.name = @"小明";
Person *personI = [[Person alloc]init];
personI.name = @"小花";
personI.comment = @"贊👍";
MicroBlog *microBlog = [[MicroBlog alloc]init];
microBlog.content = @"暑假去旅遊";
microBlog.second = 2;
NSDate *date = [NSDate date];
NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];
[dateformatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
NSString *nowTime = [dateformatter stringFromDate:date];
microBlog.time = nowTime;
microBlog.commentPerson = personI;
//這是容易忘記的一步,要給person對象設置microBlog
person.microBlog = microBlog;
[person printf];
[microBlog printComment];
return 0;
}