//The first OC Program
#import <Fundation/Function.h>
int main(int arg, const char args[])
{
NSAutoreleasePool* pool = [[NSAutorelease alloc] init ];
NSLog(@"Hello World");
[pool drain];
return (0);
}
//Second Test
#import <Fundation/Function.h>
int main(int arg, const char args[])
{
NSAutoreleasePool* pool = [[NSAutorelease alloc] init ];
int x = 50, y = 40;
int sum = x + y;
NSLog(@"The sum of x and y is %d ", sum);
[pool drain];
return (0);
}
// Obj-C 中的BOOL
// Obj-C 中的BOOL变量不同于其他语言(比如C/C++, Java),BOOL 的值只有YES和NO,
// 原理上BOOL 变量也是用8位二进制数表示。如果把一个整数赋值给布尔类型,在C++中的不等于0的都是真(true),而Obj-C中
// 变量要看8位二进制数的最低位,最低位为0则是NO,最低位为1则是YES
//间接
#import <Fundation/Funtion.h>
int main(int arg, const char args[])
{
const char* words[4] = {"x1", "x2", "x3", "x4"};// 每次需要改变这些字符串时,都需要改动源代码
int i = 0;
int wordcounts = 4;
for(; i < wordcounts; ++i)
{
NSLog(@"The %s word's length is %d ", words[i], strlen(words[i]));
}
return (0);
}
//改为文件读取
#import <Fundation/Funtion.h>
int main(int arg, const char args[])
{
FILE* pFile = fopen("/temp/words.txt","r"); //字符串存于文件中
char words[100];
while(fgets(words, 100, pFile))
{
words[strlen(words)-1] = '\0';
NSLog(@"The %s word's length is %d ", words, strlen(words[i]));
}
fclose(pFile);
return (0);
}
//oop
//面向对象编程大师 Bertrand Meyer 的开放/关闭原则(open/closed principle),即软件实体应该对扩展开放,对修改关闭。
@interface NSCircle:NSObject
{
shapeType fillShape;
colorType fillColor;
}
-(void) setShape: (shapeType) shape;
-(void) setColor: (colorType) color;
-(void) draw;
@end
@implementation NSCircle //实现方法不必按顺序,也可以有一些类中没有声明的方法,类中没有声明的方法在@implementation中算作私有方法
//但 并不是真正的私有方法! Objective-C 中并没有真正的私有方法,这只是Objective-C的副作用
-(void) setShape:(shapeType) shape // 这里注意形参与@interface中的成员变量重名时会隐藏成员变量
{
fillShape = shape;
}
-(void) setColor: (colorType) color
{
fillColor = color;
}
-(void) draw
{
NSLog(@"The shape is %@ and the color is %@", fillShape, fillColor); //实际上省略了self, %@是调用了类的description方法
}
@end
//inherit 继承
@interface Shape
{
shapeType fillShape;
colorType fillColor;
}
-(void) setShape: (shapeType) shape;
-(void) setColor: (colorType) color;
-(void) draw;
@end
@interface Circle : Shape// 子类可以共用父类的成员变量,只需重写相应的方法即可
@end
@interface Rectanle : Shape
@end
@implementation Shape
-(void) setShape: (shapeType) shape //会复制传入参数的值,如果参数是指针,则复制指针的值,传入一个指针的副本(其实是变量本身,只是指针地址被复制)
{
fillShape = shape;
}
-(void) setColor: (colorType) color
{
fillColor = color;
}
-(void) draw
{
NSLog(@"The shape is %@ and the color is %@")
}
@end
// Obj-C中的init方法
@interface MyClass
-(id) init
{
if (self = [super init])
{
// do something
}
}
MyClass* pMyClass1 = [[MyClass alloc] init];
MyClass* pMyClass2 = [MyClass new];
// 通常setter 方法是set+变量名的首字母大写
//getter方法的方法名与变量名称相同~~~~~~get这个词在Cocoa中有特殊的含义,存取方法中千万不要加入get前缀
// 在Cocoa中,get 出现在方法名里面时,通常表示这个方法会通过你传入的(指针参数)来返回数值
//合成存取方法:(调用时的命名规则不变)
//1. 在类的接口部分,在所有的属性前面@property
//2. 在类的实现部分,@synthesize (name = newName)
// 其中括号中的参数可选。使用可选的规则时,setter和getter方法不变,而类的实例变量为newName
// 点语法的使用:
// (.)在 “=” 左边,表示调用了setter
// (.)在 “=” 右边,表示调用了getter
// 例如: self.name = nil; 是调用参数为nil的setter方法,该方法先释放name所占内存,再置其值为nil
//Obj-C中所有对象间的交互都是通过指针来完成的
//不要再description方法中打印self,因为这样会导致死循环,因为打印self本身又一次调用了description方法。
NSRange:用来表示相关事物的范围
typedef _NSRange
{
unsigned int location;
unsigned int length;
} NSRange;
例如:"I like apple." apple 可以用location为8,length为5表示。
location未被赋值时,可能为NSNotFound.
@ NSRange range;
range.location = 5;
range.length = 9;
@NSRange range = {5, 9}; // C语言风格
@NSRange range = NSMakeRange(5, 9); // Obj-C风格
Obj-C风格的好处是可以在任何的函数调用中使用
[anObject function: NsSMakeRange(5, 9)];
typedef struct _NSPoint //NSMakePoint()
{
float x;
float y;
}NSPiont;
表示笛卡尔平面中的一个点
typedef struct _NSSize //NSMakeSize()
{
float width;
float height;
}NSSize;
数据的宽度和长度
typedef struct _NSRect //NSMakeRect()
{
NSPoint origin;
NSSize size;
}NSRect;
// 用数据结构是为了提升性能,因为GUI程序会用到很多临时的点,这些数据如果采用
//类来表示就要用动态分配,会牺牲性能。
NSString:处理字符串的类
//NSString 类不可变,一旦创建后不能改变它,例如不能添加和删除字符
//NSString 有一个子类NSMultableString, 是可以改变的。
NSString 的stringWithFormat的类方法原型如下:
+(id) stringWithFormat: (NSString* ) format, ...;
NSString* string = [NSString stringWithFormat:
@"I have %d apples", 5] ;
//”+“ 代表这个方法是类方法,通常用于创建新的实例时调用,创建新对象的类方法称
//为工厂方法, 类方法也可以用来访问全局变量
//例如AppKit中的NSColor类就有redColor和blueColor方法。
NSColor* color = [NSColor redColor];
//Obj-C中生成一个类的时候,会创建一个代表该类的类对象。类对象中包含
//1.指向超类的指针
//2.指向类方法列表的指针
//3.类名
//4.一个long型数据,为新创建的类实例对象指定大小(以字节为单位)
-(unsigned int) length; // 可以准确的计算标准字符串和国际化字符编码,
//如俄文,法文等~
NSString* string = [NSString stringWithFormat:"I like apple."];
int length = [string length];
-(BOOL) isEqualToString: (NSString*) string;
NSString* string1 = @"Hello";
NSString* string2 ;
string2 = [NSString stringWithFormat:"Hello"];
if ([string1 isEqualToString:string2])
//不能简单的比较指针值,比较指针值时其实是判断两个string是否指向同一个字符串
{
NSLog(@"They are the same string!");
}
// 区分大小写的比较
-(NSComparisonResult)compare:(NSString*) string;
typedef enum _NSComparisonResult //一个枚举变量
{
NSOrderedAscending = -1; //左侧的值小于右侧,即字母表中第一个字符串要靠前
NSOrderedSame;
NSOrderedDescending;
NSComparisonResult;
}
[@"a" compare: @"b"]; // 返回NSOrderedAscending;
//不区分大小写的比较
-(NSComparisonResult)compare:(NSString*) string
options:(unsigned) mask;
//options的参数是一个位掩码,可以使用|(位或)来结合使用
//常用的位掩码有:
NSCaseInsensitiveSearch //不区分大小写
NSLiteralSearch //完全比较,区分大小写
NSNumericSearch //比较字符串的字符个数,而不是字符串的值
//忽略大小写且按字符串的字符数量排序
if(NSOrderSame == [string1 compare: string2
options:NSCaseInsensitiveSearch
| NSNumericSearch])
{
NSLog(@"");
}
//判断字符串开头前缀和结尾后缀的方法
-(BOOL) hasPrefix: (NSString*) string; //是否以string作为前缀开头
-(BOOL) hasSuffix: (NSString*) string; //是否以string作为后缀结尾
NSString* string = @"abc.mov";
if([string hasPrefix:@"abc"]){NSLog();}
if([string hasSuffix:@".mov"]){NSLog();}
//判断某个字符串中是否包含另一个另一个字符串
-(NSRange)rangeOfString: (NSString*) string;
NSRange range; //返回一个range.start 和 一个 range.length
range = [@"fsfghdhfhg" rangeOfString: @"abc"];
//头文件中通常存放: 1. 类的@interface指令
2. 公共的struct定义
3. enum常量
4. #defines 和取 extern 全局变量
// 实现文件中存放: 1. 类的实现@implementation
2. 全局变量的定义
3. 私有struct
//#import <> 用来导入系统头文件
//不会重复导入
//#import “” 用来导入自定义头文件
//@class 是用来防止多重依赖时修改一个文件导致重编译的问题。这样只是声明一个类即可,而不需要了解类中有多少个实例变量。
//也可以用@class 防止循环引用的问题。
// 在继承关系链中,@class不能成功,因为继承的类需要知道父类的全部信息,需要使用#import“X.h”文件
Cocoa 框架包含两个子框架:
1.Foundation Kit //开发文档位置:/Developer/ADC Reference Library/documentation/index.html
2. Application Kit