//@implementation 类名
//方法实现代码
//@end
//下面实现member类
@implementation member
-(NSString*) name{
return name;
}
-(int) age{
return age;
}
-(void) setName:(NSString*)input{
[name autorelease];//autorelease方法将会在未来某个时候去release它。建议采用autorelease和release,release会直接删除引用
name=[input retain];//把输入对象中的值保存到实例变量上
}
-(void) setAge:(int) input
{
age=input;
}
//eg:调用本类中的age
-(BOOL) isQualified{//年龄满足条件吗?
return ([self age]>21);
}
@end
//main方法首先被调用
int main(int argc,const char * argv[])
{
NSAutoreleasePool * Pool =[[NSAutoreleasePool alloc] init];//设置自动释放池
Member* member=[[Member alloc] init];//创建一个Member对象(alloc为member变量申请一个内存空间,init方法用于初始化变量值),member的数据类型是Member,member就是一个Member类型的变量(对象)。
//附加:所有的Objective-C对象变量都是指针类型的。
[member setName:@"sam"];//为member的属性设置值
[member setAge:36];//方法调用:[实例 方法];或者是:[类名 方法名];如果有返回值:变量=[实例 方法];
NSLog(@"%@",[member name]);//打印member属性的值
NSLog(@"%i",[member age]);
[member release];//调用member的release方法,从而释放member对象的内存空间,并清空池和返回0
[pool drain];
return 0;
//输出
//几乎跟C语言中的printf()函数完全相同,“%@”表示字符串,“%i”表示整数
NSLog(@"当前的日期和时间是:%@",[NSDate date]);
NSLog(@"a=%i,b=%i,c=%i",a,b,c);
}
//输入
int n;
scanf("%i",&n);
NSLog(@"%i",n);
//标识符:方法名、类名、接口名、变量名。可以使大小写字母、数字和下划线的任意组合,但不能以数字开头。
float x=3.2,y=3f,z=0.75;//正确
如:float a=b=c=5//不允许连续赋值,错误
//指令符(@)
@"char" //定义一个字符串常量 eg:@"ABCDEFG"
@class c1,c2,...//将c1,c2...声明为类 eg:@class Person;
//还有好多,详见32页
//点语法*2015-08-13*
//dog.h
@interface Dog:NSObject{
int _age;
}
@property int age;//该行可以替代下面两行,相当于定义属性(含有get,set)
-(void) setAge:(int) newAge;
-(int) age;
@end
//dog.m
#import "Dog.h"
@implementation
@synthesize age=_age;//该行可以替代下面六行
-(void) setAge:(int)newAge{
_age=newAge;
}
-(int) age{
return _age;
}
//main方法中使用
//经典使用方法
Dog *dog=[[Dog alloc]init];
[dog setAge:300];
int dogAge=[dog age];
//点语法使用
dog.age=400;
//上行相当于[dog setAge:200];
dogAge=dog.age;
//上行相当于dogAge=[dog age];
@end
//其他格式
①readwrite(缺省),readonly
②assign,retain,copy 表示属性如何存储
③nonatomic 表示不用考虑线程安全问题
④getter=...,setter=... 重新设置getter函数和setter函数
eg:
@interface Foo:NSObject{
NSString*str;
}
@end
//表示str是只读的属性
@property(readonly)NSString*str;
#import"Foo.h"
@synthesize str;//放在实现方法外面??
@implementation Foo
...
@end
//内存管理(遛狗原理)《手动,部分自动,.NET/Java是全自动》
//C++中存在一个人创建的内存空间,另一个人释放,或是,露释放
//黄金法则
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
//类型定义:①基本类型:任何C的类型(内存管理对C语言基本类型无效)
②OC类型(非基本类型)任何继承于NSObject类的对象都属于OC类型
//所有OC对象都有一个计数器retainCount,存放当前使用者数
//alloc 创建对象使用,创建完计数器+1,只使用一次
//retain 是对一个对象的计数器+1,可以调用多次
//release是对一个对象计数器-13
//减到0,自动调用dealloc函数,对象就会从内存中释放
//计数器为0的对象不能再使用release和其他方法
eg:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc,const char* argv[])
{
@autoreleasepool{
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];
//遵循黄金法则,只要使用了alloc 就使用release
[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
NSLog(@"dog1 retain count3 is %ld",[dog1 retainCount]);
//dog1 retain count3 is 1
[xiaoLi release];//自动调用dog1 的dealloc函数
//person is dealloc
//dog1 is dealloc
[xiaoWang release];
#endif
}
return 0;
}
//Person
//Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person :NSObject{
Dog *_dog;
}
//@property (retain) Dog*dog;该行可以替代下面两行
-(void) setDog:(Dog *)aDog;
-(Dog *) dog;
@end
//Person.m
#import "Person.h"
@implementation Person
@synthesize dog=_dog;该行可以替代下面两个方法
//-(void) setDog:(Dog *)aDog
//{
// if(aDog !=_dog)
// {
// [_dog release];//*把之前的_dog所存储的dog给release掉
// _dog=[aDog retain];
// //让_dog计数器 +1
// }
//}
//-(Dog *) dog
//{
// return _dog;
//}
-(void) dealloc
{
NSLog(@"person is dealloc");
//释放该人拥有的dog
self.dog=nil;//等同于[self setDog:nil] 或是[_dog release];
[super dealloc];//清除该空间
}
@end
//Dog
//Dog.h
#import <Foundation/Foundation.h>
@interface Dog :NSObject{
int _ID;
}
@property int ID;//提供一个方法
@end
//Dog.m
#import "Dog.h"
@implementation Dog
@synthesize ID=_ID;
//dealloc方法
-(void) dealloc
{
NSLog(@"dog%d is dealloc",_ID);
[super dealloc];
}
@end
//OC 内存管理正常情况要使用大量的retain和release操作,那么点语法可以减少使用retain 和release的操作
eg:
@interface Person:NSObject{
Dog *_dog;
}
@property (reatain) Dog *dog;
@end
@implementation Person
@synthesize dog =_dog;
-(void )dealloc
{
self.dog=nil;
[super dealloc];
}
@end
//NSMutableArray数组的使用
//main.m
eg:
#import "Dog.h"
#import "MyArray.h"
int main(int argc,const char* argv[])
{
@autoreleasepool{
#if 0
NSMutableArray *array=[[NSMutableArray alloc] init];
for(int i=0;i<4;i++)
{
Dog *d =[[Dog alloc] init];
[d setID:i];//设置ID
NSLog(@"dog retainCount is %ld",[d retainCount]);
[array addObject:d];
NSLog(@"dog retainCount2 is %ld",[d retainCount]);
[d release];//释放d,那么现在只有数组array指向该d对象
}
[array release];//释放数组,在此之前array拥有4条dog
#endif
}
return 0;
}
//介绍NSMutableArray的一些方法
eg:
//MyArray.h
@interface MyArray :NSObject{
NSUInteger _count;//数组当前有几项元素
id _objs[512];//创建了一个512项的数组 4x512
}
@property (assign,readonly) NSUInteger count;
//往MyArray中加入一项元素
-(void) addObject:(id)object;
//取得第index项元素
-(id)objectAtIndex:(NSInteger)index;
//删除第index项元素
-(void)removeObjectAtIndex:(NSUInteger)index;
//删除所有元素
-(void) removeAll;
@end
//MyArray.m
@import "MyArray.h"
@implementation MyArray
@synthesize count=_count;
-(id) init
{
self=[super init];
if(self){
_count=0;
}
return self;
}
-(void) addObject:(id)object
{
if(_count>=512) return;
_objs[_count]=[object retain];//这里必须要做 [object retain];
_count++;
}
-(id)objectAtIndex:(NSInteger)index
{
return _objs[index];
}
-(void) removeObjectAtIndex:(NSUInteger)index
{
id obj =_objs[index];
[obj release];
_objs[index]=nil;//先删除后赋空
}
-(void)removeAll
{
for(int i=0;i<_count;i++)
{
[self removeObjectAtIndex:i];
}
}
//当然数组对象也有dealloc函数
-(void) dealloc
{
[self removeAll];
[super dealloc];
}
@end
//id标志符:通用对象类型。id类型是一个独特的数据类型,可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象。
//自动释放池
//ios5.0 新方式
@autorelease
{
}
//ios5.0之前老方式,其实两种方式都是等效的
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
//流浪狗收养中心:Autorelease Pool
eg:[xiaoLi setDog:[[[Dog alloc] init]autorelease]];//正确
//野指针:有指向,无数据
//内存泄露:无指向,未release
//原则:谁创建,谁release(谁污染,谁治理)不过,release对象前,需要把成员变量release
//协议(类似C#中的接口)
//关键字:@required ->需要实现 @optional->可以不实现
//①协议声明
#<import><Foundation/Foundation.h>
@protocol MyProtocol<NSObject>
@optional
-(void) init;
-(void) exit;
-(int) update:(int) time;
@required
-(void) showInfo;
@end
//②协议使用
@interface MyTest:NSObject<MyProtocol>
-(void) showInfo2;
@end
//③协议实现
@implementation MyTest
-(void) showInfo
{
NSLog(@"log file");
}
-(void)showInfo2
{
NSLog(@"log file2");
}
eg: