1.OC简介
Objective-C是一种面向对象的计算机语言,Brad J Cox 1980s 设计了Objective-C, 该语言是基于SmallTalk-80。1988 NeXT 发布了Objective-C,它的开发环境和类库叫“NEXTSTEP”,1994年NeXT与Sun发布了标准的NEXTSTEP系统,取 名“OPENSTEP”,
软件自由基金会OPENSTEP版本叫GNUStep。
1996 苹果公司开始支持NeXT,把NEXTSTEP/OPENSTEP用于 Mac OS X操作系统开发,它的版本和开发环境叫Cocoa,使用 Objective-C作为基础语言,开发工具Xcode和Interface Builder。
2007 苹果公司推出Objective-C 2.0,Objective-C是Mac OS X和 iOS开发的基础语言
特点:
OC不是一门全新的语言
C语言的基础上增加了一层最小的面向对象语法
OC完全兼容C语言语言
可以在OC代码中混入C语言代码,甚至是C++代码
可以使用OC开发Mac OS X平台和iOS平台的应用程序
2.设计类
类名:Zombies
属性:life,颜色,位置,形状
行为:走,咬,死,loseLife
炮弹
类名:Cannonball
属性:大小,威力,飞行距离,速度
行为:飞,爆炸
车
类名:Car
属性:载员,速度,牌照
行为:跑,停
学生
类名:Student
属性:姓名、学号,性别
行为:学习,逃学
手机:
类名:Phone
属性:大小,尺寸,颜色,_cup,内存
行为:打电话,发短信
3.NSString类的简介
#import <Foundation/Foundation.h>
#import <string.h>
int main(int argc, const char * argv[]) {
// NSString 对象的创建
// 1、通过字面量创建
NSString *str = @"天气冷了,注意身体!";
NSLog(@"%@",str);
// 2、通过对象方法
// NSString *str1 = [NSString new];
NSString *str1 = [NSString alloc];
// str1 = [str1 init];
str1 = [str1 initWithUTF8String:"大家要努力学习啊!"];
NSLog(@"%@",str1);
// 3、通过类方法创建对象
// 类方法它是隶属于类的,它是通过“类名”调用
// 此处的格式化字符串与NSLog中的格式化字符串是一样的
NSString *str2 = [NSString stringWithFormat:@"今天股票有跌%d个点!", 10];
NSLog(@"%@",str2);
// 4、NSString 对象中表示长度函数
// command + 鼠标左键点击进去
// length 计算的是字符串中有几个字符
long len = [str length];
NSLog(@"%ld",len);
char *strc = "天气冷了,注意身体!";
// strlen计算字符串所占用的字节数,在UTF8编码中一个中文占用3个字节
len = strlen(strc);
NSLog(@"%ld",len);
len = [@"abc你好" length];
NSLog(@"%ld",len);
return 0;
}
4.BOOL类型
BOOL OC提供的一种Boolean类型,就是用来表示逻辑上真与假这个类型
BOOL 在OC中有两个取值 YES 和 NO
YES 真 对应数字 1
NO 假 对应数字 0
使用BOOL可以提高代码可读性,减少代码的出错率
所有数据类型都可以定义变量
所有的数据类型都可以作为形参或实参
所有数据类型类都可以作为返回值
#import <Foundation/Foundation.h>
void testBool(BOOL flag)
{
if (flag) {
NSLog(@"真");
}else{
NSLog(@"假");
}
}
@interface CZLogin : NSObject
- (BOOL) vilidateUserName:(NSString *)userName andPassword:(NSString *) password;
@end
@implementation CZLogin
- (BOOL)vilidateUserName:(NSString *)userName andPassword:(NSString *)password
{
// 当对象进行==比较时候,比较是它们所指向的是不是同一个地址
// 验证用户名不能为空
// nil 空对象
if (userName == nil || [userName isEqualTo:@""]) {
NSLog(@"用户名不能为空");
return NO;
}
if (password == nil || [password isEqualTo:@""]) {
NSLog(@"密码不能为空");
return NO;
}
if ([userName isEqualTo:@"大木"] && [password isEqualTo:@"123"]) {
return YES;
}
return NO;
}
@end
int main(int argc, const char * argv[]) {
CZLogin *login = [CZLogin new];
BOOL canLogin = [login vilidateUserName:@"大木" andPassword:@""];
if (canLogin) {
NSLog(@"可以登录!");
}else{
NSLog(@"登录失败!");
}
BOOL isTrue = YES;
testBool(YES);
testBool(NO);
// 找出10~100中可以被7整除的最小的数
// for(int i = 10;i < 100;i++)
// {
// BOOL isDivisible = (i % 7 == 0);
// if (isDivisible) {
// NSLog(@"%d",i);
// break;
// }
// }
return 0;
}
5.对象与方法
1、对象做方法参数传递是地址传递
2、对象可以在方法中进行连续的传递
3、对象可以作为方法的返回值
#import <Foundation/Foundation.h>
/*
定义狗类
类名 CZDog
属性 _name
行为 biteOtherDog
*/
@interface CZDog : NSObject
{
@public
NSString *_name;
}
- (void) biteOtherDog:(CZDog *) other;
@end
@implementation CZDog
- (void) biteOtherDog:(CZDog *) other
{
NSLog(@"%@ 咬了 %@ 一口",_name,other->_name);
}
@end
/*
Person类
changeDog
orderDog: biteOtherDog:
*/
@interface CZPerson : NSObject
//用于改变狗名字
- (void) changeDog:(CZDog *) dog;
/**
* 指使一个狗去咬另外一个狗
*
* @param dog 去咬的那个狗
* @param other 被咬那只狗
*/
- (void) orderDog:(CZDog *) dog biteOtherDog:(CZDog *) other;
@end
@implementation CZPerson
//对象作为方法参数
- (CZDog *) sellDog
{
return [CZDog new];
}
//用于改变狗名字
- (void) changeDog:(CZDog *) dog
{
dog->_name = @"大黄";
}
/**
* 指使一个狗去咬另外一个狗
*
* @param dog 去咬的那个狗
* @param other 被咬那只狗
*/
- (void) orderDog:(CZDog *) dog biteOtherDog:(CZDog *) other
{
// 让去这只狗去咬另外一只狗
[dog biteOtherDog:other];
}
@end
int main(int argc, const char * argv[]) {
CZDog *dog = [CZDog new];
dog->_name = @"旺财";
CZDog *other = [CZDog new];
other->_name = @"小黑";
CZPerson *person = [CZPerson new];
[person changeDog:dog];
NSLog(@"%@",dog->_name);
// 对象作为方法参数的连续传递
[person orderDog:dog biteOtherDog:other];
CZDog *newDog = [person sellDog];
newDog->_name = @"小狗!";
NSLog(@"%@",newDog->_name);
return 0;
}
6.封装:
1、类是数据与功能的封装,数据就是成员变量,功能就类方法或对象方法
2、对数据的封装
如果我们把属性设置为@public那么,这个属性外部就可以任意的修改,我们就失去管理这个属性的权利
1、当你把属性暴露在外部的时候,那么你就是失去对它的管理,一旦这个属性被多个人用的时候,如果再像管理这个属性就变得非常麻烦,这个类的可维护性就变得很差
2、怎么对数据进行封装
1、为每一个属性提供getter 和 setter方法
2、setter方法:又称为写方法,赋值给对象赋值
1、必须是对象方法
2、它没有返回值
3、名字 set + 属性名称去掉下划线,首字母大写
4、必须提供一个参数,参数类型必须与所对象的成员变量的类型一致
3、getter方法:又称为读方法,赋值读取属性的值
1、必须是对象方法
2、必须要返回值,并且返回值类型要与成员变量类型一致
3、方法名必须是成员变量去掉下划线
4、一定是空参的
3在对象方法中访问成员变量的时候,其中隐藏一个指针
当方法中如果没有与成员变量名称相同变量,编译器在编译会自动给它加上一个self指针
如果有与成员变量同名的局部变量,那么这个名字就是一个局部变量,编译器就不会再给他加上self指针了
#import <Foundation/Foundation.h>
#import "CZCat.h"
/**
设计车类,提供getter和setter方法
1> 车
(1)属性
* 轮子数
* 速度
(2)方法
* 属性相应的setter和getter方法
*/
@interface CZCar : NSObject
{
int _wheels;//车轮数‘
double _speed;//速度
}
//_wheels setter
- (void) setWheels:(int) wheels;
- (int) wheels;
- (void) setSpeed:(double) speed;
- (double) speed;
@end
@implementation CZCar
//_wheels setter
- (void) setWheels:(int) wheels
{
_wheels = wheels;
}
- (int) wheels
{
return _wheels;
}
- (void) setSpeed:(double) speed
{
_speed = speed;
}
- (double) speed
{
return _speed;
}
@end
int main(int argc, const char * argv[]) {
CZCat *cat = [CZCat new];
[cat setAge:100];
[cat setName:@"小黑"];
NSLog(@"age = %d,name = %@",[cat age],[cat name]);
return 0;
}