文档章节

Obj-C 学习的一些基础语法

Lambda8421
 Lambda8421
发布于 2015/01/28 17:37
字数 1960
阅读 42
收藏 0
//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

© 著作权归作者所有

Lambda8421
粉丝 10
博文 121
码字总数 121640
作品 0
闸北
程序员
私信 提问
C/C++与Objective-C的区别(转载)

Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。所以有一定C/C++语言基础理解和掌握Objective-C也会相应的快些。这回,我们将比较着学习Objective-C语...

晨曦之光
2012/05/16
868
0
什么是闭包,我的理解

首先,我觉得,一个概念,如果不理解也不影响使用的话,那么,就没必要去理解它、去学习它。闭包就是这样一个概念,你不理解它也能很好的用它。俺这两年写as3程序,是天天在和它打交道,甚至...

最美的回忆
2017/11/16
0
0
Objective_C扩展机制学习

学obj_c已有一年时间了,开发iphone也有一年时间了。首先学习obj_c的时候,是赁着c/c++的基础,所学的知识是按c/c++的方式去学习,其实obj_c是c的超集当时一点也没体会到,其精髓也是完全没有...

长平狐
2012/08/13
116
0
[更新]Apple Swift学习资料汇总

今年的苹果开发者大会(WWDC)上,公布了ios8的几个新特性,其中包括引入了群聊功能,支持第三方输入法等功能。但更让开发者感兴趣的莫过于Swift语言的发布了。 Swift是apple自创的一门转为coc...

geeklxl
2014/06/05
5K
8
IOS学习笔记——Objective-c基础(一)

最近自学ios,ios的支持语言是Objective-c,所以要学习ios就需要先学习Objective-c语言。当掌握了Objective-c的基础知识之后,我们就可以入手学习iOS开发做出一些自己的应用。 我现在还是...

丛林迷雾
2012/12/30
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
58分钟前
6
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
4
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
5
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
3
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部