OC_语法入门_day5_内存管理_计数器/set方法/property的参数/循环引用/自动释放池

H:/Objective-C/OC_day5/00-01-改错题.m
1.description
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end

@implementation Person
// 类方法中不能访问成员变量
//+ (NSString *)description
- (NSString *)description
{
    return [NSString stringWithFormat:@"_age=%d", _age];
}
@end

// 1个错误

/*-------------------------牛B的分隔线-------------------------*/

2.id、SEL、类对象
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)test;
@property int age;
@end

@implementation Person
- (void)test
{
    // 会引发死循环错误
    //[self performSelector:_cmd];
}
@end

int main()
{
    // id后面不能加上*
    //id *p = [[Person alloc] init];
    id p = [[Person alloc] init];
    [p setAge:10];
    
    // id类型的变量不能用点语法
    // p.age = 10;
    
    Class c = [Person class];
    // 类对象只能调用类方法,不能调用对象方法
    //[c test];
    
    return 0;
}

H:/Objective-C/OC_day5/00-02-分析题.m
1.description方法
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end

@implementation Person
+ (NSString *)description
{
    return @"A";
}
- (NSString *)description
{
    return @"B";
}
@end

int main()
{
    Person *p = [Person new];
    Person *p2 = [[Person class] new];
    NSLog(@"%@", p);
    NSLog(@"%@", p2);
    NSLog(@"%@", [Person class]);
    NSLog(@"%@", [p class]);
    return 0;
}
/*-------------------------牛B的分隔线-------------------------*/
1.description方法
2007-01-01  10:00:38.727 5435345[1185:303] B
2007-01-01  10:00:38.728 5435345[1185:303] B
2007-01-01  10:00:38.729 5435345[1185:303] A
2007-01-01  10:00:38.729 5435345[1185:303] A

/*-------------------------牛B的分隔线-------------------------*/

2.类的加载过程
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end

@interface Student : Person
@end

@interface GoodStudent : Student
@end

int main()
{
    Student *s = [[Student alloc] init];
    return 0;
}

@implementation Student
+ (void)load
{
    NSLog(@"Student+load");
}
+ (void)initialize
{
    NSLog(@"Student+initialize");
}
@end

@implementation GoodStudent(MJ)
+ (void)load
{
    NSLog(@"GoodStudent-MJ+load");
}
+ (void)initialize
{
    NSLog(@"GoodStudent-MJ+initialize");
}
@end

@implementation GoodStudent
+ (void)load
{
    NSLog(@"GoodStudent+load");
}
+ (void)initialize
{
    NSLog(@"GoodStudent+initialize");
}
@end

@implementation Person
+ (void)load
{
    NSLog(@"Person+load");
}
+ (void)initialize
{
    NSLog(@"Person+initialize");
}
@end

/*-------------------------牛B的分隔线-------------------------*/

2.类的加载过程
2007-01-01  10:00:56.252 5435345[1192:303] Person+load
2007-01-01  10:00:56.254 5435345[1192:303] Student+load
2007-01-01  10:00:56.254 5435345[1192:303] GoodStudent+load
2007-01-01  10:00:56.255 5435345[1192:303] GoodStudent-MJ+load
2007-01-01  10:00:56.255 5435345[1192:303] Person+initialize
2007-01-01  10:00:56.256 5435345[1192:303] Student+initialize

H:/Objective-C/OC_day5/00-03-类的设计-0-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
@property int height;
@property NSString *name;

- (id)initWithName:(NSString *)name andAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age andHeight:(int)height;
@end

H:/Objective-C/OC_day5/00-03-类的设计-1-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person

- (id)initWithName:(NSString *)name andAge:(int)age andHeight:(int)height
{
    if (self = [super init])
    {
        _name = name;
        _age = age;
        _height = height;
    }
    return self;
}

- (id)initWithName:(NSString *)name andAge:(int)age
{
    return [self initWithName:name andAge:age andHeight:0];
}

@end

H:/Objective-C/OC_day5/00-03-类的设计-2-Student.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.h
 */
#import "Person.h"

@interface Student : Person
@property int no;

- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;
@end

H:/Objective-C/OC_day5/00-03-类的设计-3-Student.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.m
 */

#import "Student.h"

@implementation Student
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
    if (self = [super initWithName:name andAge:age])
    {
        _no = no;
    }
    return self;
}
@end

H:/Objective-C/OC_day5/00-03-类的设计-4-NSObject+ClassName.h
//
//  NSObject+ClassName.h
//  03-编程题
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (ClassName)
// 增加一个类方法输出类名
+ (void)printClassName;

// 增加一个对象输出类名
- (void)printClassName;
@end

H:/Objective-C/OC_day5/00-03-类的设计-5-NSObject+ClassName.m
//
//  NSObject+ClassName.m
//  03-编程题
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "NSObject+ClassName.h"

@implementation NSObject (ClassName)
+ (void)printClassName
{
    NSLog(@"当前的类名是:%@", self);
}

- (void)printClassName
{
    NSLog(@"当前的类名是:%@", [self class]);
}
@end

H:/Objective-C/OC_day5/00-03-类的设计-6-NSString+MJ.h
//
//  NSString+MJ.h
//  03-编程题
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (MJ)
// 增加一个类方法计算某个字符串内部英文字母的个数
+ (int)zimuCountOfStr:(NSString *)str;

// 增加一个对象方法计算当前字符串内部英文字母的个数
- (int)zimuCount;

// 增加一个类方法比较两个字符串的长度,返回长度差
+ (int)compareLengthBetweenStr1:(NSString *)str1 andStr2:(NSString *)str2;

// 增加一个对象方法和其他字符串比较长度,返回长度差
- (int)compareLengthWithOther:(NSString *)other;
@end

H:/Objective-C/OC_day5/00-03-类的设计-7-NSString+MJ.m
//
//  NSString+MJ.m
//  03-编程题
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "NSString+MJ.h"

@implementation NSString (MJ)
// 增加一个类方法计算某个字符串内部英文字母的个数
+ (int)zimuCountOfStr:(NSString *)str
{
    return [str zimuCount];
}

// 增加一个对象方法计算当前字符串内部英文字母的个数
- (int)zimuCount
{
    // 1.定义变量记录字母的个数
    int count = 0;
    
    for (int i = 0; i<self.length; i++)
    {
        // 2.取出每一个字符
        unichar c = [self characterAtIndex:i];
        
        // 3.如果字符是英文字母
        if ( (c>='a' && c<='z') || (c>='A' && c<='Z') )
        {
            count++;
        }
    }
    return count;
}

// 增加一个类方法比较两个字符串的长度,返回长度差
+ (int)compareLengthBetweenStr1:(NSString *)str1 andStr2:(NSString *)str2
{
    return [str1 compareLengthWithOther:str2];
}

// 增加一个对象方法和其他字符串比较长度,返回长度差
- (int)compareLengthWithOther:(NSString *)other
{
    // self.length返回的是NSUInterger类型,转成int就不会有警告
    return (int)(self.length - other.length);
}
@end

H:/Objective-C/OC_day5/00-03-类的设计-8-main.m
//
//  main.m
//  03-编程题
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

#import "NSObject+ClassName.h"

#import "NSString+MJ.h"

void test1();
void test2();
void test3();

int main()
{   
    test3();
    return 0;
}

void test1()
{
    Person *p1 = [[Person alloc] initWithName:@"Rose" andAge:20];
    
    Person *p2 = [[Person alloc] initWithName:@"Jack" andAge:30 andHeight:150];
    
    Student *s1 = [[Student alloc] initWithName:@"Jim" andAge:25];
    
    Student *s2 = [[Student alloc] initWithName:@"Jake" andAge:28 andHeight:170];
    
    Student *s3 = [[Student alloc] initWithName:@"Kate" andAge:26 andNo:10];
}

void test2()
{
    [NSObject printClassName];
    [NSString printClassName];
    [Person printClassName];
    [Student printClassName];
    
    NSObject *o = [[NSObject alloc] init];
    [o printClassName];
    
    NSString *str = @"test";
    [str printClassName];
    
    Person *p = [[Person alloc] init];
    [p printClassName];
    
    Student *s = [[Student alloc] init];
    [s printClassName];
}

void test3()
{
    NSString *str1 = @"Jack145";
    
    NSString *str2 = @"Jack";
    
    
    NSLog(@"字母的个数:%d", [str1 zimuCount]);
    
    NSLog(@"长度差:%d", [str1 compareLengthWithOther:str2]);
}

    

H:/Objective-C/OC_day5/00-OC内存管理_总结.m
一、计数器的基本操作
1> retain : +1
2> release :-1
3> retainCount : 获得计数器

二、set方法的内存管理
1> set方法的实现
- (void)setCar:(Car *)car
{
    if ( _car != car )
    {
        [_car release];
        _car = [car retain];
    }
}

2> dealloc方法的实现(不要自己直接调用dealloc)
- (void)dealloc
{
    [_car release];
    [super dealloc];
}

三、@property参数
1> OC对象类型
@property (nonatomic, retain) 类名 *属性名;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id car;

// 被retain过的属性,必须在dealloc方法中release属性
- (void)dealloc
{
    [_car release];
    [super dealloc];
}

2> 非OC对象类型(int\float\enum\struct)
@property (nonatomic, assign) 类型名称 属性名;
@property (nonatomic, assign) int age;

四、autorelease
1.系统自带的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
[NSString stringWithFormat:....];
[NSDate date];

2.开发中经常写一些类方法快速创建一个autorelease的对象
* 创建对象的时候不要直接使用类名,而要用self,可创建子类对象

H:/Objective-C/OC_day5/01-引用计数器的基本操作-0-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;

@end

H:/Objective-C/OC_day5/01-引用计数器的基本操作-1-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person


// 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
    NSLog(@"Person对象被回收");
    
    // super的dealloc一定要调用,而且放在最后面
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/01-引用计数器的基本操作-2-main.m
//
//  main.m
//  01-引用计数器的基本操作
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

/*
 1.方法的基本使用
 1> retain :计数器+1,会返回对象本身
 2> release :计数器-1,没有返回值
 3> retainCount :获取当前的计数器
 4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面
 
 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
 
 */

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    // 1
    Person *p = [[Person alloc] init];
    
    //NSUInteger c = [p retainCount];
    
    //NSLog(@"计数器:%ld", c);
    
    
    // 2 retain方法返回的是对象本身
    [p retain];
    
    // 1
    [p release];
    
    // 0 野指针:指向僵尸对象(不可用内存)的指针
    [p release];
    
    [p retain];
    
    // -[Person setAge:]: message sent to deallocated instance 0x100109a10
    // 给已经释放的对象发送了一条-setAge:消息:
    p.age = 10;
    //[p setAge:10];
    
    // 指针p变成空指针
    //p = nil;
    
    // EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存
    // 野指针错误
    // OC不存在空指针错误,给空指针发送消息,不报错
    [p release];
    [p release];
    [p release];
    [p release];
    
    [nil release];
    
    return 0;
}


H:/Objective-C/OC_day5/02-多个对象之间的内存管理-0-Book.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Book.h
 */
#import <Foundation/Foundation.h>

@interface Book : NSObject
{
    int _price;
}

- (void)setPrice:(int)price;
- (int)price;


@end

H:/Objective-C/OC_day5/02-多个对象之间的内存管理-1-Book.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Book.m
 */

#import "Book.h"


@implementation Book

- (void)setPrice:(int)price
{
    _price = price;
}

- (int)price
{
    return _price;
}
- (void)dealloc
{
    NSLog(@"Book对象被回收");
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/02-多个对象之间的内存管理-2-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>
#import "Book.h"

@interface Person : NSObject
{
    Book *_book;
}

- (void)setBook:(Book *)book;
- (Book *)book;

@end

H:/Objective-C/OC_day5/02-多个对象之间的内存管理-3-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person
- (void)setBook:(Book *)book
{
    _book = [book retain];
}

- (Book *)book
{
    return _book;
}

- (void)dealloc
{
    [_book release];
    NSLog(@"Person对象被回收");
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/02-多个对象之间的内存管理-4-main.m
//
//  main.m
//  02-多个对象之间的内存管理
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

/*
 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
 
 3.谁retain,谁release
 
 4.谁alloc,谁release
 */

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"

int main()
{
    // b-1
    Book *b = [[Book alloc] init];
    // p-1
    Person *p1 = [[Person alloc] init];
    
    //p1想占用b这本书
    // b-2
    [p1 setBook:b];
    
    // p-0
    // b-1
    [p1 release];
    p1 = nil;
    
    // b-0
    [b release];
    b = nil;
    return 0;
}


H:/Objective-C/OC_day5/03-set方法的内存管理-0-Car.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Car.h
 */
#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    int _speed;
}

- (void)setSpeed:(int)speed;
- (int)speed;
@end

H:/Objective-C/OC_day5/03-set方法的内存管理-1-Car.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Car.m
 */

#import "Car.h"

@implementation Car
- (void)setSpeed:(int)speed
{
    _speed = speed;
}
- (int)speed
{
    return _speed;
}


- (void)dealloc
{
    /*
     _speed :直接访问成员变量
     self->_speed :直接访问成员变量
     self.speed : get方法
     [self speed] : get方法
     */
    
    NSLog(@"速度为%d的Car对象被回收了", _speed);
    
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-2-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>
#import "Car.h"

@interface Person : NSObject
{
    Car *_car;
    int _age;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setCar:(Car *)car;
- (Car *)car;

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-3-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

// _car -> c1  0

@implementation Person
- (void)setCar:(Car *)car
{
    if (car != _car)
    {
        // 对当前正在使用的车(旧车)做一次release
        [_car release];
        
        // 对新车做一次retain操作
        _car = [car retain];
    }
}
- (Car *)car
{
    return _car;
}

- (void)setAge:(int)age
{ // 基本数据类型不需要管理内存
    _age = age;
}
- (int)age
{
    return _age;
}

- (void)dealloc
{
    // 当人不在了,代表不用车了
    // 对车做一次release操作
    [_car release];
    
    NSLog(@"%d岁的Person对象被回收了", _age);
    
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-4-Dog.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Dog.h
 */
#import <Foundation/Foundation.h>

@interface Dog : NSObject

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-5-Dog.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Dog.m
 */

#import "Dog.h"

@implementation Dog

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-6-Student.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.h
 */
#import <Foundation/Foundation.h>
#import "Car.h"
#import "Dog.h"

@interface Student : NSObject
{
    int _no;
    NSString *_name;
    Car *_car;
    Dog *_dog;
}

- (void)setNo:(int)no;
- (int)no;

- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setCar:(Car *)car;
- (Car *)car;

- (void)setDog:(Dog *)dog;
- (Dog *)dog;

@end

H:/Objective-C/OC_day5/03-set方法的内存管理-7-Student.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.m
 */

#import "Student.h"

@implementation Student
- (void)setNo:(int)no
{
    _no = no;
}
- (int)no
{
    return _no;
}

- (void)setName:(NSString *)name
{
    if ( name != _name )
    {
        [_name release];
        _name = [name retain];
    }
}

- (NSString *)name
{
    return _name;
}

- (void)setCar:(Car *)car
{
    if ( car != _car )
    {
        [_car release];
        _car = [car retain];
    }
}
- (Car *)car
{
    return _car;
}

- (void)setDog:(Dog *)dog
{
    if ( dog != _dog )
    {
        [_dog release];
        _dog = [dog retain];
    }
}
- (Dog *)dog
{
    return _dog;
}

- (void)dealloc
{
    [_name release];
    [_car release];
    [_dog release];
    
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/03-set方法的内存管理-8-main.m
//
//  main.m
//  03-set方法的内存管理
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Car.h"
#import "Person.h"
#import "Student.h"
#import "Dog.h"
/*
 内存管理代码规范:
 1.只要调用了alloc,必须有release(autorelease)
   对象不是通过alloc产生的,就不需要release
 
 2.set方法的代码规范
 1> 基本数据类型:直接复制
 - (void)setAge:(int)age
 { 
    _age = age;
 }
 
 2> OC对象类型
 - (void)setCar:(Car *)car
 {
    // 1.先判断是不是新传进来对象
    if ( car != _car )
    {
        // 2.对旧对象做一次release
        [_car release];
 
        // 3.对新对象做一次retain
        _car = [car retain];
    }
 }
 
 3.dealloc方法的代码规范
 1> 一定要[super dealloc],而且放到最后面
 2> 对self(当前)所拥有的其他对象做一次release
 - (void)dealloc
 {
    [_car release];
    [super dealloc];
 }
 */

// 速度为100的车子:
// 速度为200的车子:p1->_car

int main()
{
    // stu - 1
    Student *stu = [[Student alloc] init];
    
    // Car - 2
    // 这行内存有内存泄露
    //stu.car = [[Car alloc] init];
    
    // stu - 0
    // Car - 1
    [stu release];
    
    
    // 这行内存有内存泄露
    // [[Car alloc] init].speed = 100;
    
    return 0;
}


void test3()
{
    Student *stu = [[Student alloc] init];
    
    
    Car *c = [[Car alloc] init];
    stu.car = c;
    
    
    Dog *d = [[Dog alloc] init];
    
    stu.dog = d;
    
    
    NSString *s = @"Jack";
    
    stu.name = s;
    
    [d release];
    [c release];
    [stu release];
}

void test2()
{
    Person *p1 = [[Person alloc] init];
    p1.age = 20;
    
    // c1 - 1
    Car *c1 = [[Car alloc] init];
    c1.speed = 100;
    // c1 - 2
    p1.car = c1;
    // c1 - 1
    [c1 release];
    
    Car *c2 = [[Car alloc] init];
    c2.speed = 200;
    // c1 - 0
    p1.car = c2;
    
    [c2 release];
    
    [p1 release];
}

void test1()
{
    // p-1
    Person *p = [[Person alloc] init];
    p.age = 20;
    
    // c1-1
    Car *c1 = [[Car alloc] init];
    c1.speed = 250;
    
    // c1-2
    p.car = c1;
    
    // c1-1
    [c1 release];
    
    
    
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    
    
    
    
    [p release];
}

void test()
{
    // p-1
    Person *p = [[Person alloc] init];
    p.age = 20;
    
    // c1-1
    Car *c1 = [[Car alloc] init];
    c1.speed = 250;
    
    // p想拥有c1
    // c1-2
    p.car = c1;  // [p setCar:c1];
    
    // c2-1
    Car *c2 = [[Car alloc] init];
    c2.speed = 300;
    
    // p将车换成了c2
    // c1-1
    // c2-2
    p.car = c2;
    
    // c2-1
    [c2 release];
    // c1-0
    [c1 release];
    // p-0 c2-0
    [p release];
}

H:/Objective-C/OC_day5/04-@property参数-0-Book.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Book.h
 */
#import <Foundation/Foundation.h>

@interface Book : NSObject

@end

H:/Objective-C/OC_day5/04-@property参数-1-Book.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Book.m
 */

#import "Book.h"

@implementation Book

@end

H:/Objective-C/OC_day5/04-@property参数-2-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>
#import "Book.h"

@interface Person : NSObject
@property int age;

// retain : 生成的set方法里面,release旧值,retain新值
@property (retain) Book *book;
@property (retain) NSString *name;

@end

H:/Objective-C/OC_day5/04-@property参数-3-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person

//- (void)setBook:(Book *)book
//{
//    if (_book != book)
//    {
//        [_book release];
//        
//        _book = [book retain];
//    }
//}

- (void)dealloc
{
    [_book release];
    [_name release];
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/04-@property参数-4-Student.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.h
 */
#import <Foundation/Foundation.h>
#import "Book.h"

@interface Student : NSObject

@property (retain) Book *book;

@property (retain) NSString *name;

@end

H:/Objective-C/OC_day5/04-@property参数-5-Student.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Student.m
 */

#import "Student.h"

@implementation Student


- (void)dealloc
{
    [_book release];
    [_name release];
    
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/04-@property参数-6-main.m
//
//  main.m
//  04-@property参数
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"

int main()
{
    Book *b = [[Book alloc] init];
    Person *p = [[Person alloc] init];
    
    p.book = b;
    
    
    NSLog(@"%ld", [b retainCount]);
    
    
    [p release];
    [b release];
    return 0;
}


H:/Objective-C/OC_day5/05-@property参数-0-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>

/*
 1.set方法内存管理相关的参数
 * retain : release旧值,retain新值(适用于OC对象类型)
 * assign : 直接赋值(默认,适用于非OC对象类型)
 * copy   : release旧值,copy新值
 
 2.是否要生成set方法
 * readwrite : 同时生成setter和getter的声明、实现(默认)
 * readonly  : 只会生成getter的声明、实现
 
 3.多线程管理
 * nonatomic : 性能高 (一般就用这个)
 * atomic    : 性能低(默认)
 
 4.setter和getter方法的名称
 * setter : 决定了set方法的名称,一定要有个冒号 :
 * getter : 决定了get方法的名称(一般用在BOOL类型)
 */

@interface Person : NSObject


// 返回BOOL类型的方法名一般以is开头
@property (getter = isRich) BOOL rich;

//   
@property (nonatomic, assign, readwrite) int weight;
// setWeight:
// weight

// 
@property (readwrite, assign) int height;

@property (nonatomic, assign) int age;

@property (retain) NSString *name;
@end

H:/Objective-C/OC_day5/05-@property参数-1-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person

@end

H:/Objective-C/OC_day5/05-@property参数-2-main.m
//
//  main.m
//  05-@property参数
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    Person *p = [[Person alloc] init];
    
    
    p.rich = YES;
    
    BOOL b = p.isRich;
    
    return 0;
}


H:/Objective-C/OC_day5/06-模型设计练习-0-User.h
/*
 作者:MJ
 描述:微博用户
 时间:
 文件名:User.h
 */
#import <Foundation/Foundation.h>

typedef enum {
    SexMan, // 男
    SexWoman // 女
} Sex;

typedef struct {
    int year;
    int month;
    int day;
} Date;

// 姓名、微博号码、密码、头像、性别、手机、生日

@interface User : NSObject

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *account;

@property (nonatomic, retain) NSString *password;

// http://weibo.com/a.png  URL
@property (nonatomic, retain) NSString *icon;

@property (nonatomic, assign) Sex sex;

@property (nonatomic, retain) NSString *phone;

@property (nonatomic, assign) Date birthday;

@end

H:/Objective-C/OC_day5/06-模型设计练习-1-User.m
/*
 作者:MJ
 描述:
 时间:
 文件名:User.m
 */

#import "User.h"

@implementation User
- (void)dealloc
{
    [_name release];
    [_account release];
    [_icon release];
    [_password release];
    [_phone release];
    
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/06-模型设计练习-2-Status.h
/*
 作者:MJ
 描述:微博
 时间:
 文件名:Status.h
 */
#import <Foundation/Foundation.h>
#import "User.h"

// 微博内容、微博配图、发送时间、微博发送人、转发的微博、被评论数、被转发数

@interface Status : NSObject

@property (nonatomic, retain) NSString *text;

@property (nonatomic, retain) NSString *icon;


// 从1970-01-01 00:00:00 开始,一共度过了多少毫秒
@property (nonatomic, assign) long time;
//@property (nonatomic) time_t time;

@property (nonatomic, retain) User *user;

@property (nonatomic, retain) Status *retweetStatus;

@property (nonatomic, assign) int commentsCount;
@property (nonatomic, assign) int retweetsCount;

@end

H:/Objective-C/OC_day5/06-模型设计练习-3-Status.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Status.m
 */

#import "Status.h"

@implementation Status
- (void)dealloc
{
    [_text release];
    [_user release];
    [_retweetStatus release];
    [_icon release];
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/06-模型设计练习-4-main.m
//
//  main.m
//  06-模型设计练习
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "User.h"
#import "Status.h"

int main()
{
    // 新建2个用户
    User *u = [[User alloc] init];
    u.name = @"2B";
    
    User *u2 = [[User alloc] init];
    u2.name = @"傻B";
    
    // 新建2条微博
    Status *s = [[Status alloc] init];
    s.text = @"今天天气真好!";
    s.user = u;
    
    Status *s2 = [[Status alloc] init];
    s2.text = @"今天天气真的很好!";
    s2.retweetStatus = s;
    s2.user = u2;
    
    [u2 release];
    [u release];
    [s2 release];
    [s release];
    return 0;
}


H:/Objective-C/OC_day5/07-循环引用-0-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>
#import "Card.h"
// @class仅仅是告诉编译器,Card是一个类
//@class Card;

@interface Person : NSObject

@property (nonatomic, retain) Card *card;

@end

H:/Objective-C/OC_day5/07-循环引用-1-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"
#import "Card.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"Person被销毁了");
    [_card release];
    
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/07-循环引用-2-Card.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Card.h
 */
#import <Foundation/Foundation.h>


@class Person;

@interface Card : NSObject

@property (nonatomic, assign) Person *person;

@end

H:/Objective-C/OC_day5/07-循环引用-3-Card.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Card.m
 */

#import "Card.h"
#import "Person.h"

@implementation Card


- (void)dealloc
{
    NSLog(@"Car被销毁了");
    
    // [_person release];
    
    [super dealloc];
}

@end

H:/Objective-C/OC_day5/07-循环引用-4-main.m
//
//  main.m
//  07-循环引用
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//


/*
 1.@class的作用:仅仅告诉编译器,某个名称是一个类
 @class Person; // 仅仅告诉编译器,Person是一个类
 
 2.开发中引用一个类的规范
 1> 在.h文件中用@class来声明类
 2> 在.m文件中用#import来包含类的所有东西
 
 3.两端循环引用解决方案
 1> 一端用retain
 2> 一端用assign
 
 */

#import <Foundation/Foundation.h>
#import "Card.h"
#import "Person.h"

int main()
{
    // p - 1
    Person *p = [[Person alloc] init];
    // c - 1
    Card *c = [[Card alloc] init];
    
    // c - 2
    p.card = c;
    
    // p - 1
    c.person = p;
    
    // c - 1
    [c release];
    
    // p - 0  c - 0
    [p release];
    return 0;
}


H:/Objective-C/OC_day5/08-autorelease-0-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person
- (void)dealloc
{
    NSLog(@"Person---dealloc");
    
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/08-autorelease-1-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, assign) int age;

@end

H:/Objective-C/OC_day5/08-autorelease-2-main.m
//
//  main.m
//  08-autorelease
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

/*
 1.autorelease的基本用法
 1> 会将对象放到一个自动释放池中
 2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
 3> 会返回对象本身
 4> 调用完autorelease方法后,对象的计数器不变
 
 2.autorelease的好处
 1> 不用再关心对象释放的时间
 2> 不用再关心什么时候调用release
 
 3.autorelease的使用注意
 1> 占用内存较大的对象不要随便使用autorelease
 2> 占用内存较小的对象使用autorelease,没有太大影响
 
 
 4.错误写法
 1> alloc之后调用了autorelease,又调用release
 @autoreleasepool
 {
    // 1
    Person *p = [[[Person alloc] init] autorelease];
 
    // 0
    [p release];
 }
 
 2> 连续调用多次autorelease
 @autoreleasepool
 {
    Person *p = [[[[Person alloc] init] autorelease] autorelease];
 }
 
 5.自动释放池
 1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
 2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
 
 
 6.自动释放池的创建方式
 1> iOS 5.0前
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
 [pool release]; // [pool drain];
 
 
 2> iOS 5.0 开始
 @autoreleasepool
 {
    
 }
 */

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    Person *pp = [[[Person alloc] init] autorelease];
    
    [pool release]; // [pool drain];
    
    @autoreleasepool
    {
    
        // 1
        Person *p = [[[[Person alloc] init] autorelease] autorelease];
        
        // 0
        // [p release];
    }
    
    return 0;
}


void test()
{
    @autoreleasepool
    {// { 开始代表创建了释放池
        
        // autorelease方法会返回对象本身
        // 调用完autorelease方法后,对象的计数器不变
        // autorelease会将对象放到一个自动释放池中
        // 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
        Person *p = [[[Person alloc] init] autorelease];
        
        p.age = 10;
        
        
        
        @autoreleasepool
        {
            // 1
            Person *p2 = [[[Person alloc] init] autorelease];
            p2.age = 10;
            
            
        }
        
        
        Person *p3 = [[[Person alloc] init] autorelease];
        
        
    } // } 结束代表销毁释放池
}


H:/Objective-C/OC_day5/09-autorelease的应用-0-Person.h
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.h
 */
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, assign) int age;


+ (id)person;

+ (id)personWithAge:(int)age;

@end

H:/Objective-C/OC_day5/09-autorelease的应用-1-Person.m
/*
 作者:MJ
 描述:
 时间:
 文件名:Person.m
 */

#import "Person.h"

@implementation Person


+ (id)person
{
    return [[[self alloc] init] autorelease];
}


+ (id)personWithAge:(int)age
{
    Person *p = [self person];
    p.age = age;
    return p;
}

- (void)dealloc
{
    NSLog(@"%d岁的人被销毁了", _age);
    
    [super dealloc];
}
@end

H:/Objective-C/OC_day5/09-autorelease的应用-2-GoodPerson.h
/*
 作者:MJ
 描述:
 时间:
 文件名:GoodPerson.h
 */
#import "Person.h"

@interface GoodPerson : Person

@property (nonatomic, assign) int money;

@end

H:/Objective-C/OC_day5/09-autorelease的应用-3-GoodPerson.m
/*
 作者:MJ
 描述:
 时间:
 文件名:GoodPerson.m
 */

#import "GoodPerson.h"

@implementation GoodPerson

@end

H:/Objective-C/OC_day5/09-autorelease的应用-4-main.m
//
//  main.m
//  09-autoreleased的应用
//
//  Created by apple on 13-8-9.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "GoodPerson.h"

/*
 1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
 
 2.开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象
 1> 创建对象时不要直接用类名,一般用self
 + (id)person
 {
    return [[[self alloc] init] autorelease];
 }
 */

int main()
{
    @autoreleasepool {
        Person *p = [Person personWithAge:100];
        
        
        GoodPerson *p2 = [GoodPerson personWithAge:10];
        
        p2.money = 100;
    }
    return 0;
}

void test()
{
    Person *p = [[Person alloc] init];
    
    p.age = 200;
    
    [p release];
    
    // 包
    // Student com.mj.test
    // Student com.mj.test2
    
    // MJStudent
    
    // SBStudent
    
    // Next Step
    
    
    @autoreleasepool
    {
        //        Person *p2 = [Person person];
        //
        //        p2.age = 100;
        
        Person *p2 = [Person personWithAge:100];
        
        //        Person *p2 = [[[Person alloc] init] autorelease];
        //
        //        p2.age = 300;
        
        
        NSString *str = @"123123";
        
        NSString *str2 = [NSString stringWithFormat:@"age is %d", 10];
        
        NSNumber *num = [[NSNumber alloc] initWithInt:10];
        [num release];
        
        
        NSNumber *num2 = [NSNumber numberWithInt:100];
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值