• Object-C基础学习笔记(1)


    1、苹果公司将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架集;
    提供Cocoa组成部分有:
    (1)Foundation框架(有很多有用的,面向数据的低级类和数据结构);
    (2)Application Kit(也称AppKit)框架(包含了所有的用户接口对象和高级类,例如NS……),
    还有一个支持框架的套件,包括Core Animation和Core Image。

    NS前缀
    在IOS开发中,经常会遇到NS开头的对象,这个要从乔帮主历史恩怨说起。
    当年Steve Jobs 和John Scullery与恩怨,乔帮主当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,
    里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。


    2、NSLog() 相当于 print()
    NSLog(@"hello Object-c");
    //注:@是Objective-C在标准C语言基础上添加的特征之一,双引号的字符串前面有一个@,
    这表示引用的字符串应该作为Cocoa的NSString元素处理
    NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent));
    /注意%@:使用NSLog输出任何对象值时,都会使用这个格式说明


    3、BOOL使用8位存储,YES定义为1,NO定义为0,大于1不为YES,跟标准C不同。
    若不小心将一个长于1字节的整型值赋给BOOL,则只截取低八位
    Obejective-C中1不等于1,绝对不要将BOOL值和YES比较


    4、Object-C语法结构:

    在Objective-C里面没有public和private的概念,你可以认为全是public;
    它只有类方法和实例方法,加号(+)表示类方法,类方法可以直接调用,而不用创建这个类的实例;
    减号(-)表示实例方法,需要创建这个类的实例对象才可以调用。
    如:(Object-C)
    -(void)hello:(BOOL)ishello
    {
    //XXOO
    }
    (C#/Java)
    private void Hello(bool ishello)
    {
    //XXOO
    }

    如何调用刚才写的方法(Object-C中说消息)
    (Object-C)
    [self hello:Yes];
    (C#)
    this.hello(true);


    5、比较常见的函数库:
    NSLog、NSString、NSInteger、NSURL、NSImage

    还可以看到其他名字打头的一些类,比如CF、CA、CG、UI等等
    CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface


    6、Object-C常见语法说明:
    1 头文件引用使用 #import “文件名”或者 #import <文件名>的形式以确保每个头文件仅被包含一次;
    2 类声明以 @interface 类名:继承类 开头,以 @end 结尾,类实现以@implementation 类名 开头,以 @end 结尾;
    3 实例方法,即成员方法,在方法名前面添加一个减号(-);类方法,在方法名前面添加一个加号(+);
    4 类方法的调用格式为 [类名 类方法],成员方法调用格式为 [实例名 实例方 法],这种模式在ObjC中被称为消息机制,
    [对象 消息]即给对象发送了一个消息,产生的 效果就是该对象调用了该类中定义的对应的实例方法;

    如:(Object-C)

    Print类.h文件(声明文件)
    ++++++++++++++++++++++++++++++
    #import <Foundation/Foundation.h>

    @interface Print:NSObject{//Object-C的所有类都继承于NSObject
    //成员属性
    NSString *caption;
    NSString *photographer;
    }

    //在Object-C2.0引入了属性合成,相当于C#中的get/set方法
    @property(nonatomic,copy)NSString *caption;
    @property(nonatomic,copy)NSString *photographer;

    //类方法
    +(NSString*)printName;

    @end

    Print类.m文件(实现文件)
    ++++++++++++++++++++++++++++++
    @implementation Print

    @synthesize photographer;

    @synthesize caption;

    //类方法
    +(NSString*)printName
    {
    return (@"Print Result");
    }

    @end

    Print类使用
    ++++++++++++++++++++++++++++++

    #import 'Print.h'

    int main(int argc,const char *argv[])
    {
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
    return NSApplicationMain(argc,(const char**)argv);
    //类方法的调用
    NSLog(@"ClassName=/"%@/"",[Print printName]);

    //初始化
    Print* p=[[Print alloc]init];

    //设置器调用
    [p setCaption:@"MyCaption"];
    [p setPhotographer:@"MyPhotographer]"];

    [pool drain];

    return 0;
    }

    运行结果:
    2015-05-2 11:12:13.715 demo[1471:903] ClassName = "Print Result"

    2015-05-2 11:12:13.718 demo[1471:903] Caption = "MyCaption"

    2015-05-2 11:12:13.718 demo[1471:903] Photographer = "MyPhotographer

    PS:
    苹果公司的iphone平台采用Objective-C做为native language的开发,Objective-C的内核是C语言的,
    并基于C语言实现OOP的一些特性。Objective-C是对C语言的扩展,这和C++的前身Better-c有很大的相似之处,
    Objective-C的新版本里实现了和Java类似的垃圾回收机制,但基于iphone平台的资源限制,
    iphone平台并不支持垃圾回收机制。


    总结:
    1、Object-C方法调用(Calling Methods):
    [object method];
    [object methodWithinput:input];
    2、对象方法的返回值
    output=[object methodWithOutput];
    output=[object methodWithinputAndOutput:input];
    3、创建对象
    id myObject=[NSString string];
    //id指的是任意类型,为指针。这里即可:
    NSString* myString=[NSString string];
    //所有的Object-对象变量都是指针类型
    4、嵌套消息调用(Nested Messages)
    如:function1(function2());
    (Object-C)
    [NSString stringWithFormat:[prefs format]];
    //避免一行代码里嵌套调用超过两个
    5、多参数输入的方法(Multi-Input Methods)
    定义一个多输入参数的方法:
    -(BOOL)writeToFile:(NSString*)path atomically:(BOOL)userAuciliaryFile;
    调用该方法:
    BOOL result=[myData writeToFile:@"tmp/log.txt" atomically:NO];
    //参数不一定要给它命名,在运行期,系统的这个方法的真实名字叫writeToFile:atomically:
    6、Accessors(Getter&Setter)--访问器
    //在Objective-C里面所有的实例对象默认都是私有的。
    //所有在大多数情况下我们需要用accessors去读取或者设置变量的值。
    //设置对象变量的值有以下两种方式:
    [photo setCaption:@"Day at the Beach"];
    output =[photo caption];//该代码并非直接去读对象实例的变量,实际上它调用的是名为caption的方法。
    方括号:都是向一个对象或者一个类发送一个消息
    7、Dot Syntax (.语法)
    //在Object-c2.0里,新增了一个"."操作,在Mac OS X 10.5里使用了Object-C2.0语法
    photo.caption=@"Day at the Beach";
    output=photo.caption;
    //注:这两种方式都可以使用,但在一个工程里最好保持风格一致,只使用某一种。
    8、创建对象
    主要有两种方式创建对象
    第一种:NSString* myString=[NSString string];
    //注:习惯的风格,在这种情况下,我们创建的是系统自动释放的(autoreleased)类型的对象。
    第二种:NSString* myString=[[NSString alloc]init];
    //注:这是嵌套的方法调用。第一个调用的NSString的自己的alloc方法。
    //较为底层的调用,创建了内容、以及实例化了一个对象。
    //我们在这里可以用不同的初始化方式去赋初值
    NSNumber* value=[[NSNumber alloc]initWithFloat:1.0];
    9、基本内存管理
    //假如我们正在为Mac OS X开发一个应用程序,我们可以选择是否启用垃圾回收机制。
    //这就意味着我们不需要去考虑内存管理,除了一个特别复杂的情形我们需要处理一下。
    //然而,我们有的时候我们的开发环境没有垃圾回收机制,比如iPhone开发的时候就没有垃圾回收机制。
    //在这种情况下,我们就需要了解一些基本的内存管理方面的概念。
    //假如我们手动的通过alloc创建了一个对象,我们需要用完这个对象后release它。
    //我们不需要手动的去release一个autoreleased类型的对象,假如真的这样去做的话,我们的应用程序将会crash。
    //string1 will be released automatically
    NSString* string1 =[NSString string];
    //must release this when done
    NSString* string2=[[NSString alloc]init];
    [string2 release];
    //现在暂且认为凡是autoreleased的对象在调用完成后就会被释放,以后还需进一步的完善

    10、设计类
    //对于Object-C语言而言,创建一个类非常简单,它分为两个部分
    //类的接口通常保存在ClassName.h文件里,它定义了实例的参数,以及一些公开的方法。
    //类的实现在ClassName.m文件里。它包含了真正运行的代码和那些方法。
    //它还经常定义一些私有的方法。这些私有的方法对于子类是不可见的。

    如:有个类名为Photo的接口文件:Photo.h 代码如下:
    #import

    @interface Photo:NSObject{//声明Photo类,继承自NSObject类
    //定义成员变量,这里是NSStrig*类型,也可以为任意类型id类型
    NSString* caption;
    NSString* photographer;
    }
    //增加方法,Object-C方法不需要加get前缀。
    //Getters,返回类型为NSString*类型
    -(NSString*) caption;
    -(NSString*) photographer;
    //Setters,返回类型指定为void类型
    -(void)setCaption:(NSString*)input;
    -(void)setPhotographer:(NSString*)input;

    @end

    Photo类的实现,代码如下:
    #import "Photo.h"
    //getters 实现
    @implementation Photo
    -(NSString*)caption{
    return caption;
    }

    -(NSString*)photographer{
    return photographer;
    }

    //setters
    -(void) setCaption:(NSString*)input{
    [caption autorelease];
    caption=[input retain];
    }

    -(void) setPhotographer:(NSString*)input{
    [photographer autorelease];
    caption=[input retain];
    }
    //在支持垃圾回收的环境里,我们可以直接赋值就可以了
    //如:
    //-(void) setCaption:(NSString*)input{
    // caption=input;
    //}
    @end


  • 相关阅读:
    微信小程序 scroll-view switch checkbox
    微信小程序 全选和取消全选
    微信小程序 for循环添加样式1
    微信小程序 类似弹出菜单特效,从右向左滑出
    微信小程序 for循环 wx:for和wx:if wx:elif嵌套着使用
    微信小程序 输入框限制字数
    微信小程序 从本地相册选择图片或使用相机拍照chooseImage()和预览图片previewImage()
    安卓开发感言
    安卓-singleTask
    安卓-什么是FrameLayout
  • 原文地址:https://www.cnblogs.com/cdz-sky/p/4517743.html
Copyright © 2020-2023  润新知