Objective-C知识点滴记录

本文介绍了Objective-C的基础知识,包括方法调用、嵌套调用、类的创建等内容,并讲解了面向对象编程的基本概念如封装、继承等。同时,还探讨了类目(Category)这一Objective-C特有的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、方法调用基本语法
   [object method];
   [object methodWithInput:input];
   方法可以有返回值:
   output = [object methodWithOutput];
   output = [object methodWithInputAndOutput:input];
   还可以调用累方法:
   id myStr = [NSString string];
   id类型意味着myStr可以是任意类型的对象。
   或者:NSString* myStr = [NSString string];
   注意:在对象类型的右边有一个星号(*),在Objective-C中所有的对象变量都是指针类型,id类型已经被预定义为指针类型,所以不需要加一个星号。

2、方法嵌套调用
   在许多编程语言中,嵌套的方法或函数是这样调用的:
   function1(function2()); //function2()的返回值作为参数传递给function1()。
   在Objective-C中,嵌套的方法或函数调用:
   [NSString stingWithFormat:[prefs format]];
   要尽量避免在一行语句中进行两层以上的嵌套,这样会使代码的可读性降低。

3、多个输入参数的方法定义
   在Objective-C中,一个方法的名字可以被拆分成几段:
   - (BOOL) writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
   你可以这样调用这个方法:
   BOOL result = [myDate writeToFile:@"/tmp/log.txt" atomically:NO];
   这些不是命名参数。在运行中,该方法的名字实际上是:writeToFile:atomically:

4、点操作符
   在Mac OS X 10.5中,Objective-C 2.0新增了点操作符的设置器(setter)和获取器(getter):
   user.name = @"Mike"; //[user setName:@"Mike"];
   output = user.name;   //output = [user name];
   区别:点语法只能使用在设置器(setter)和获取器(getter)上,而不能用于普通方法!

5、在Nil上调用方法
   在Objective-C中,nil对象的作用等同于其他语言的NULL指针。不同的地方在于,在nil上调用方法不会导致程序崩溃或抛出异常。

6、类的创建
   在Objective-C语法中,一个类通常分为两部分:类的接口(头文件)和类的实现。
   类的接口(interface)通常存放在类似ClassName.h的文件中,在这里我们定义实例变量和公用方法(public)。
   类的实现存放在ClassName.m这样的文件中,它实现了接口中定义的方法。通常还可以定义外面不能访问的私有方法(private)。
   User.h
   --------------------
   #import <Cocoa/Cocoa.h>
   @interface User : NSObject
    {
         NSString* username;
         NSString* password;
    }
    - (NSString*) username;
    - (NSString*) password;
    - (void) setUsername:(NSString*) input;
    - (void) setPassword:(NSString*) input;
    @end
  
   User.m
   --------------------
   #import "User.h"
   @implemention User
   - (NSString*) username
   {
         return username;
   } 
   - (NSString*) password
   {
         return password;
   }
   - (void) setUsername:(NSString*) input
   {
         [username autorelease];
         username = [input retain];
   }
   - (void) setPassword:(NSString*) input
   {
         [password autorelease];
         password = [input retain];
   }
   @end
   在Objective-C中,get这个词有着特殊含义,获取器(getter)是不带get前缀的。方法前面的减号(-)表示这是一个实例方法,如果方法名前面是个加号(+),表示这是一个类方法。
   释放一个对象有两种方法:release和autorelease。标准的release会立即释放对象的引用,autorelease直到当前方法结束才会释放(除非你添加自定义的代码来明确的改变它)。

7、类目(Category)
   类目是Objective-C中最有用的一个特性。类目允许你为一个已存在的类添加一些方法,而不用子类化该类,也不需要你了解该类的实现细节。
   例如:我想给NSString添加一个方法,判断它是不是一个URL,写法如下:
   NSString-NSStringHelper.h
   -------------------------------
   #import <Cocoa/Cocoa.h>
   @interface NSString (NSStringHelper)
    - (BOOL) isURL;
   @end
   这很像一个类的声明,不同的地方在于后面没有列出父类,并且在括号里写了类目的名字。
类目的名字可以随便取,但最好能表达出你在类目中包含的方法所要做的事。
   #import "NSString-NSStringHelper.h"
   @implemention NSString (NSStringHelper)
    - (BOOL) isURL
    {
          if ([self hasPrefix:@"http://"])
               return YES;
          else
               return NO;
    }
   @end
    现在你可以使用NSString的这个方法了:
    NSString* str1 = @"http://www.iteye.com";
    NSString* str2 = @"HelloWorld";
    if ([str1 isURL])
         NSLog(@"str1 is a URL.");
    if ([str2 is URL])

         NSLog(@"str2 is a URL");


1.对C语言的扩展

Xcode的.m扩展名表示文件含有Objective-C代码,应由Objective-C编译器处理。C编译器处理名称以.c结尾的文件,C++编译器处理.cpp文件,而.mm文件可以混编C、C++、Objective-C三类代码,所有这些编译工作全由GCC(GNU Complier Collection,GUN编译器集合)处理,这个编译器能够理解C语言的全部3个变体。

#import<Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h头文件,#import可保证头文件只被包含一次。

框架是一种聚集一个单元的部分集合,包含头文件、库、图像声音文件等。

NSLog(@"");里双引号前的@符号表示引用的字符串应该作为Cocoa的NSString元素来处理,NSLog()其本质上就是Cocoa中的printf()函数它接受一个格式字符串,并将后续参数的值插入到这个格式说明符中。

Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间YES定义为1,而NO定义为0。


2.面向对象(OOP)编程基础知识

封装:又叫隐藏实现,就是只公开代码单元的对外接口,而隐藏其具体实现。

继承:一种代码重用方式,在Objective-C里只有单重继承。

符合:即将各个部分组合在一起,严格地讲,只有对象间的组合才能叫复合。

间接:不在代码中直接使用某个值,而是使用指向该值的指针。

类:是一种结构,它表示对象的类型,对象引用类来获取和本身有关的各种信息,特别是运行什么代码来处理每种操作,Objective-C编程风格建议开发人员使用首字母大写的类名。

对象:是一种结构,它包含值和指向其类的隐藏指针。

实例:“对象”的另一种称呼。

消息:是对象可以执行的操作,用于通知对象去做什么,对象接受消息后,将查询对应的类,以便查找正确的代码来运行。

方法:是为响应消息而运行的代码,根据对象的类,消息可以调用不同的方法,改变方法的实现时需要重写(override)集成方法。

接口:是对象的类应该提供的特性的描述,通常,接口被成为API(application  proramming interface)。

实现:是使接口正常工作的代码。

超类:是你所继承的类。

父类:是超类的另一种表达方式。

子类:是实施继承的类。

孩子类:是子类的另一种表达方式。


3.源文件组织

如果你看到的头文件名是用尖括号括起来的,那么这个头文件对你的项目来说是只读的,因为它属于系统;如果头文件名是被引号括起来的,那么你(或参与这个项目的其他人)就可以编译它。

如果头文件没有引入而提示错误消息,有两种方法可以解决这个错误问题。第一种就是用#import语句导入类名.h,这样编译器会获得关于这两个类的大量信息,另一个更好的办法,加入@class类名;@class创建了一个向前引用,就是在告诉编译器:“相信我,以后你会知道这个类到底是什么。但是现在,你只需要知道这些。“另外,如果有依赖关系,@class也很有用,即A类使用B类,B类也使用A类,使用#import语句会让这两个类相互引用而最后出现编译错误,而使用@class这两个类就可以互相引用了。

在Cocoa中,当看到字符“CF”时,就是看到了苹果公司Core Foundation框架相关的内容,Core Foundation框架与Cocoa一样,但它是用C语言实现的它的大部分代码都是开源的。


Category(类目)的缺点:

  1. 如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
  2. 如果有多个category同一个class的成员函数进行重写,那么具体的行为是未定义

Category(类目)的应用:

  1. 对类进行扩展或patch。
  2. 使用category或(anonymous category)来模拟实现private method。
  3. 使用category(informal protocol)来实现delegation,在cocoaframework中就大量使用了category来声明delegate methods。
  4. 利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值