H:/Objective-C/OC_day5/00-01-改错题.m
H:/Objective-C/OC_day5/00-02-分析题.m
H:/Objective-C/OC_day5/00-03-类的设计-0-Person.h
H:/Objective-C/OC_day5/00-03-类的设计-1-Person.m
H:/Objective-C/OC_day5/00-03-类的设计-2-Student.h
H:/Objective-C/OC_day5/00-03-类的设计-3-Student.m
H:/Objective-C/OC_day5/00-03-类的设计-4-NSObject+ClassName.h
H:/Objective-C/OC_day5/00-03-类的设计-5-NSObject+ClassName.m
H:/Objective-C/OC_day5/00-03-类的设计-6-NSString+MJ.h
H:/Objective-C/OC_day5/00-03-类的设计-7-NSString+MJ.m
H:/Objective-C/OC_day5/00-03-类的设计-8-main.m
H:/Objective-C/OC_day5/00-OC内存管理_总结.m
H:/Objective-C/OC_day5/01-引用计数器的基本操作-0-Person.h
H:/Objective-C/OC_day5/01-引用计数器的基本操作-1-Person.m
H:/Objective-C/OC_day5/01-引用计数器的基本操作-2-main.m
H:/Objective-C/OC_day5/02-多个对象之间的内存管理-0-Book.h
H:/Objective-C/OC_day5/02-多个对象之间的内存管理-1-Book.m
H:/Objective-C/OC_day5/02-多个对象之间的内存管理-2-Person.h
H:/Objective-C/OC_day5/02-多个对象之间的内存管理-3-Person.m
H:/Objective-C/OC_day5/02-多个对象之间的内存管理-4-main.m
H:/Objective-C/OC_day5/03-set方法的内存管理-0-Car.h
H:/Objective-C/OC_day5/03-set方法的内存管理-1-Car.m
H:/Objective-C/OC_day5/03-set方法的内存管理-2-Person.h
H:/Objective-C/OC_day5/03-set方法的内存管理-3-Person.m
H:/Objective-C/OC_day5/03-set方法的内存管理-4-Dog.h
H:/Objective-C/OC_day5/03-set方法的内存管理-5-Dog.m
H:/Objective-C/OC_day5/03-set方法的内存管理-6-Student.h
H:/Objective-C/OC_day5/03-set方法的内存管理-7-Student.m
H:/Objective-C/OC_day5/03-set方法的内存管理-8-main.m
H:/Objective-C/OC_day5/04-@property参数-0-Book.h
H:/Objective-C/OC_day5/04-@property参数-1-Book.m
H:/Objective-C/OC_day5/04-@property参数-2-Person.h
H:/Objective-C/OC_day5/04-@property参数-3-Person.m
H:/Objective-C/OC_day5/04-@property参数-4-Student.h
H:/Objective-C/OC_day5/04-@property参数-5-Student.m
H:/Objective-C/OC_day5/04-@property参数-6-main.m
H:/Objective-C/OC_day5/05-@property参数-0-Person.h
H:/Objective-C/OC_day5/05-@property参数-1-Person.m
H:/Objective-C/OC_day5/05-@property参数-2-main.m
H:/Objective-C/OC_day5/06-模型设计练习-0-User.h
H:/Objective-C/OC_day5/06-模型设计练习-1-User.m
H:/Objective-C/OC_day5/06-模型设计练习-2-Status.h
H:/Objective-C/OC_day5/06-模型设计练习-3-Status.m
H:/Objective-C/OC_day5/06-模型设计练习-4-main.m
H:/Objective-C/OC_day5/07-循环引用-0-Person.h
H:/Objective-C/OC_day5/07-循环引用-1-Person.m
H:/Objective-C/OC_day5/07-循环引用-2-Card.h
H:/Objective-C/OC_day5/07-循环引用-3-Card.m
H:/Objective-C/OC_day5/07-循环引用-4-main.m
H:/Objective-C/OC_day5/08-autorelease-0-Person.m
H:/Objective-C/OC_day5/08-autorelease-1-Person.h
H:/Objective-C/OC_day5/08-autorelease-2-main.m
H:/Objective-C/OC_day5/09-autorelease的应用-0-Person.h
H:/Objective-C/OC_day5/09-autorelease的应用-1-Person.m
H:/Objective-C/OC_day5/09-autorelease的应用-2-GoodPerson.h
H:/Objective-C/OC_day5/09-autorelease的应用-3-GoodPerson.m
H:/Objective-C/OC_day5/09-autorelease的应用-4-main.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];
}
}