oc笔记(1)

//@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:

时间: 2024-10-14 20:01:40

oc笔记(1)的相关文章

023-Foundation框架(上)-OC笔记

学习目标 1.[理解]NSString 2.[了解]NSString的常用方法 3.[了解]NSRange 4.[了解]NSMutableString 5.[掌握]NSArray 6.[了解]NSArray的常用方法 7.[掌握]遍历数组的三种方式 8.[了解]NSArray与字符串 9.[掌握]NSMutableArray 一.NSString 在OC中,使用NSString类型的对象来保存一个字符串对象的地址,OC字符串必须要使用 @ 前缀.NSString其实是Foundation框架中的

019-OC特有语法-OC笔记

学习目标 1.[了解]类的本质 2.[掌握]SEL数据类型 3.[掌握]点语法 4.[掌握]@property和@synthesize 5.[了解]动态类型和静态类型 6.[理解]id和instancetype 7.[理解]动态类型检测 8.[掌握]构造方法 一.类的本质 当程序执行的时候,程序中所有类都会自动加载到内存中的代码区(类加载).并且一旦类加载到代码区,会直到程序结束才会被回收. 那么类以什么形式加载到代码区的呢? 系统首先会在代码区创建一个Class对象,将类的信息(类名.属性.方

015-OC基础语法-OC笔记

学习目标 1.[了解]Objective-C语言简介 2.[掌握]第一个OC程序 3.[掌握]OC中的字符串 4.[熟悉]OC中的一些玩意 5.[了解]面向过程与面向对象 6.[掌握]类的声明和实现 7.[掌握]类的方法 一.Objective-C语言简介 Objective-C简称Obj-C或者OC,Objective的意思就是面向对象的.OC其实就是在C语言的基础之上,封装了一层面向对象的语法,他并不是一门全新的编程语言.OC是Mac OS X系统和iOS系统的主要开发编程语言,当然马上要被

024-Foundation框架(下)-OC笔记

学习目标 1.[理解]NSDictionary 2.[了解]NSDictionary的常用方法 3.[掌握]NSDictionary的遍历 4.[理解]NSMutableDictionary 5.[了解]NSFileManager 6.[了解]Foundation常用结构体 7.[了解]NSNumber 8.[了解]NSValue 9.[了解]NSDate 10.[了解]集合的内存管理 11.[了解]copy和mutableCopy 12.[理解]单例模式 一.NSDictionary NSAr

021-ARC与分类-OC笔记

学习目标 1.[掌握]自动释放池 2.[理解]ARC机制 3.[理解]单个对象的内存管理 4.[理解]多个对象的内存管理 5.[掌握]ARC机制下的循环引用问题 6.[了解]MRC和ARC的兼容 7.[了解]MRC自动转为ARC 8.[掌握]分类Category 一.自动释放池 使用@autoreleasepool关键字声明一个代码块,这个代码块中的对象调用autorelease方法后,在自动释放池被销毁的时候,会统一调用一次这些对象的release方法(注意只是调用对象的release方法,并

016-类与对象-OC笔记

学习目标 1.[理解]对象在内存中的存储 2.[理解]nil和NULL 3.[了解]#pragma mark分组导航标记 4.[理解]方法与函数 5.[掌握]多文件开发 6.[掌握]对象和方法 7.[掌握]对象和属性 一.对象在内存中的存储 类加载: 当程序启动时,会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,而且只会调用一次.并且类一旦加载到内存,就不会被回收,直到程序结束的时候才会被回收.这个过程就叫做类加载. 当第一次使用某个类创建对象的时候,就会调用当前类的+

OC笔记:类的基础知识及代码示例

类 1.类的定义: 类=属性+方法: -属性代表类的特征 -方法是类能对变化做出的反应 类定义的格式:类的声明和类的实现组成 -接口(类的声明):@interface 类名:基类的名字 .类名首字母要大写 .冒号表示继承关系,冒号后面的是类的父类 .NSObject是OC所有类的基类 .类的声明放在“类名+.h”文件中,要由两部分组成:实例变量和方法 -实现(类的实现):@implementation类名 .方法实现 -都用@end结束c 2.类的使用: OC中,对象通过指针来声明   如:Cl

OC笔记一:Objective

1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码,甚至是C++代码 可以使用OC开发Mac OS X平台和iOS平台的应用程序 2. OC语法概述 2.1关键字 每一种语言都有关键字,比如C语言的 flaot.int等等,那么oc有哪些关键字呢? 基本上所有关键字都是以@开头 下面列举一些常见的关键字,可以先预览一下,不用去翻资料查找它们的含义

OC笔记一:Objective-C简介

1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码,甚至是C++代码 可以使用OC开发Mac OS X平台和iOS平台的应用程序 2. OC语法概述 2.1关键字 每一种语言都有关键字,比如C语言的 flaot.int等等,那么oc有哪些关键字呢? 基本上所有关键字都是以@开头 下面列举一些常见的关键字,可以先预览一下,不用去翻资料查找它们的含义

oc 笔记--NSArray

NSArray说明 -oc中枚举就是遍历的意思,区别c语言中的枚举 -Foundation中的数组(NSArray,NSMutableArray)是一组有序的对象集合 -数组只能存储对象(类的实例) NSArray使用 -通过下标获取到数组中的各个元素 -与字符串相同,数组分为可变和不可变数组 NSArray注意 -数组中不可以存放基本数据类型,只能存放类的实例(对象) -如若需要将基本数据类型/结构体放入数组中,需要通过NSNumber  NSValue进行“封装” NSArray实例 创建不