#import <Foundation/Foundation.h>數組
//.txtapp
//.dataatom
//.bssspa
//.heaporm
//.stack對象
//引用計數內存
//count = 10字符串
//count --;string
//count = 0it
int main(int argc, const char * argv[]) {
@autoreleasepool {
char *pstr = malloc(1000);
char *pstr1 = pstr;
char *pstr2 = pstr;
scanf("%s", pstr);
printf("%s\n", pstr);
free(pstr);
pstr = NULL;
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"對象被釋放");
[super dealloc];
}
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
//ARC automatic reference counting //自動引用計數
//MRC manaul reference counting //手動引用計數
//對於引用計數來講,有一套內存管理的黃金法則:
//The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.
//若是對一個對象使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease。
//通俗一點的說法就是誰污染誰治理,誰殺的誰埋。
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *xiaoHei = [[Dog alloc] init];
//[xiaoHei release];//release 計數器-1 自動調用dealloc
}
NSLog(@"程序退出");
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
@end
//對於引用計數來講,有一套內存管理的黃金法則:
//The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.
//若是對一個對象使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease。
//通俗一點的說法就是誰污染誰治理,誰殺的誰埋。
//建立一個對象, 對應的引用計數 retainCount
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *xiaoHei = [[Dog alloc] init];
NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);//獲取引用計數值
//retain : 引用計數進項保留(增長對對象的擁有權), 引用計數加1
Dog *xiaoBai = [xiaoHei retain];
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
Dog *xiaoHua = [xiaoHei retain];
NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);
[xiaoHei release];//使引用計數減1
xiaoHei = nil;
NSLog(@"retainCount = %ld", xiaoBai.retainCount);
[xiaoBai release];
NSLog(@"retainCount = %ld", xiaoHua.retainCount);
[xiaoHua release];//dealloc
xiaoHua = nil;
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
NSLog(@"今每天氣不錯, 是出遊的日子");
sleep(1);
//NSLog(@"retainCount = %ld", xiaoHua.retainCount);//當一個對象被釋放後, 不該該再給它發送消息
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
Dog *_dog;
}
- (void)setDog:(Dog *)newDog;
- (Dog *)dog;
- (void)dealloc;
@end
#import "Person.h"
@implementation Person
//寫法一 不OK
//- (void)setDog:(Dog *)dog
//{
// _dog = dog;
//}
//寫法二
//- (void)setDog:(Dog *)dog
//{
// _dog = [dog retain];
//}
//寫法三
//- (void)setDog:(Dog *)dog
//{
// [_dog release];
// _dog = [dog retain];
//}
//標準寫法
- (void)setDog:(Dog *)dog
{
if (_dog!=dog) {
[_dog release];
_dog =[dog retain];
}
}
- (Dog *)dog
{
return _dog;
}
- (void)dealloc
{
NSLog(@"dog dealloc");
[super dealloc];
}
@end
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//寫法一
//xiaohei 被釋放, 那麼per.dog被釋放
// Dog *xiaoHei = [[Dog alloc] init];
// Person *per = [[Person alloc] init];
// per.dog = xiaoHei;
//
// [xiaoHei release];
//
// [per release];
//寫法二, 若是人再持有別的狗,就會形成第一條狗得不到釋放,內存泄露
// Dog *xiaoHei = [[Dog alloc] init];
// Dog *xiaoBai = [[Dog alloc] init];
//
// Person *per = [[Person alloc] init];
// per.dog = xiaoHei ;
// NSLog(@"count = %ld", xiaoHei.retainCount);
// [xiaoHei release];//count =1;
// per.dog = xiaoBai;
//
// [xiaoBai release];
// [per release];
//寫法三
//若是原本持有一條狗,又從新設置這條狗,先進行release,這個時候,極可能dog就銷燬了,而後,就無法再次retain了
// Dog *xiaoHei = [[Dog alloc] init];
// Dog *xiaoBai = xiaoHei;
// Person *per = [[Person alloc] init];
// per.dog = xiaoHei;
// per.dog = xiaoBai;
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
NSString *_name;
int _age;
Dog *_dog;
}
//assign 直接賦值 int float long long long (基本數據類型)
//@property (nonatomic, assign) Dog *dog;
@property (nonatomic, assign)int age;
@property (nonatomic, retain)Dog *dog;
@property (nonatomic, copy)NSString *name;
@end
#import "Person.h"
@implementation Person
//assgin
- (void)setAge:(int)age
{
_age = age;
}
//retain (自定類 類定義的變量)
- (void)setDog:(Dog *)dog
{
if (_dog!=dog) {
[_dog release];
_dog =[dog retain];
}
}
//copy NSString NSArray NSDirctionary
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
@end
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//NSString *str= @"xiaoHei";
//NSMutableString *str= [NSMutableString stringWithFormat:@"xiaoHei"];
char *pstr = malloc(100);
strcpy(pstr, "xiaoHei");
NSString *str = [NSString stringWithUTF8String:pstr];
//NSString *str = [NSString stringWithFormat:@"%@",str];
Person *per = [[Person alloc] init];
per.name = str;
NSLog(@"str = %p", str);
NSLog(@"name = %p", per.name);
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
//copy
//mutableCopy
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
//copy
//copy 把可變對象或者不可變對象, 拷貝生成不可變對象
NSString *str = @"helloworld";
NSMutableString *mulStr = [NSMutableString stringWithString:str];
id obj1 = [str copy];
id obj2 = [mulStr copy];
//NSLog(@"str = %p", str);
//NSLog(@"obj = %p", obj1);
NSLog(@"mulStr = %p", mulStr);
NSLog(@"obj2 = %p", obj2);
NSLog(@"obj2 = %@", obj2);
//[obj appendString:@"zhongguo"];
//[obj2 appendString:@"zhongguo"] ;
//NSLog(@"%@", obj);
//[obj release];
[obj2 release];
*/
//multableCopy
//把可變對象或者不可變對象, 拷貝生成可變對象
NSString *str = @"qiangfeng";
NSMutableString *mulStr = [NSMutableString stringWithString:str];
id obj = [str mutableCopy];
id obj2 = [mulStr mutableCopy];
NSLog(@"%@", obj);
NSLog(@"obj2 = %@", obj2);
[obj appendString:@"helloworld"];
NSLog(@"%@", obj);
[obj2 appendString:@"1000phone"];
NSLog(@"obj2 = %@", obj2);
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//字符串內存管理, retainCount 的值不定, 只管遵照內存管理法則
NSString *str = @"qianfeng";//常量區
NSLog(@"str = %ld", str.retainCount);
NSString *str1 = [[NSString alloc] initWithString:str];
NSLog(@"%p %p", str, str1);
NSLog(@"str1 = %ld", str1.retainCount);
NSString *str2 = [[NSString alloc] initWithFormat:@"%@,%d", str, 12345];
//str2 對象存儲在堆中
NSLog(@"str2 = %ld", str2.retainCount);
NSString *str3 = [str retain];
NSLog(@"str3 = %ld", str3.retainCount);
NSString *str4 = [str1 retain];
NSLog(@"str4 = %ld", str4.retainCount);
NSString *str5 = [str2 retain];
NSLog(@"str5 = %ld", str5.retainCount);
NSMutableString *str6 = [[NSMutableString alloc] initWithString:str];
NSLog(@"str6 = %ld", str6.retainCount);
NSMutableString *str7 = [str6 retain];
NSLog(@"str7 = %ld", str7.retainCount);
[str1 release];
[str2 release];
[str3 release];
[str4 release];
[str5 release];
[str6 release];
[str7 release];
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
//數組
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *xiaoHei = [[Dog alloc] init];
Dog *xiaoBai = [[Dog alloc] init];
Dog *xiaoHua = [[Dog alloc] init];
Dog *xiaoHuang = [[Dog alloc] init];
NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);
NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:xiaoBai,xiaoHei,xiaoHua,xiaoHuang, nil];
NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);
NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);
[arr addObject:xiaoBai];
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
[arr addObject:xiaoBai];
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
//當往數組中添加對象, 對應的對象的引用計數加1
NSLog(@"len = %ld", [arr count]);
[xiaoBai release];
[xiaoHei release];
[xiaoHua release];
[xiaoHuang release];
NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);
NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);
NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);
[arr release];//把數組中的每一個元素,引用計數減1
//NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);
//NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);
//NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);
//NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
#import "Dog.h"
@implementation Dog
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
//autorelease autoreleasepool
int main(int argc, const char * argv[]) {
@autoreleasepool {//自動釋放池
Dog *xiaoHei = [[Dog alloc] init];
//[xiaoHei release];
[xiaoHei autorelease];//把xiaoHei的擁有權給自動釋放池, 自動池幫咱們釋放對象內存
//自動釋放池相似數組,自動釋放池把其中的每一個對象都release一次
NSLog(@"count = %ld", xiaoHei.retainCount);
}
@autoreleasepool {
}
@autoreleasepool {
}
return 0;
}
————————————————————————————————————分割————————————————————————————
#import <Foundation/Foundation.h>
@interface Dog : NSObject
+(Dog *)DogCreat;
@end
#import "Dog.h"
@implementation Dog
//在類方法裏面也要遵照內存管理法則
+ (Dog *)DogCreat
{
Dog *dog = [[self alloc] init];
//[dog release]; 不能調用
[dog autorelease];
return dog;
}
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [Dog DogCreat];
}
return 0;
}