objective-c 订阅
Objective-C 展开全文
Objective-C
信息
操作系统
OS X
开发语言
C/C++
开源协议
未知
Objective-C
Objective-C ,通常写作 ObjC 和较少用的 Objective C 或 Obj-C ,是扩充 C 的面向对象编程语言。它主要使用于 Mac OS X 和 GNUstep 这两个使用 OpenStep 标准的系统,而在 NeXTSTEP 和 OpenStep 中它更是基本语言。Objective-C 可以在 gcc 运作的系统写和编译,因为 gcc 含 Objective-C 的编译器。 Objective-C 是非常「实际」的语言。它使用一个用 C 写成、很小的运行库,只会令应用程序的大小增加很小,和大部分 OO 系统使用极大的 VM 执行时间会取代了整个系统的运作相反。ObjC 写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和 Smalltalk 系统要使用极大的存储器来开启一个窗口的情况相反。 Objective-C 的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到 Smalltalk 回收时有漫长的「死亡时间」,令整个系统失去功用。Objective-C 为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是 GNUstep), Apple 在其 Mac OS X 10.3中仍未引入这个功能。 另一个问题是 ObjC 不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在 Cocoa 编程环境中,所有 Mac OS X 类别和函式均有「NS」作为前缀,例如 NSObject 或 NSButton 来清楚分辨它们属于 Mac OS X 核心;使用「NS」是由于这些类别的名称在 NeXTSTEP 开发时定下。 虽然 Objective-C 是 C 的超集,但它也不视 C 的基本型别为第一级的对象。 和 C++不同,Objective-C 不支援运算子多载(它不支持ad-hoc多型)。亦与 C++不同,但和 Java 相同,Objective-C 只容许物件继承一个类别(不设多重继承)。Categories 和 protocols 不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。
收起全文
精华内容
参与话题
问答
  • Objective-C开发经典教程

    热门讨论 2014-03-05 14:59:14
    如果你具备一些编程经验,但还是Objective-C新手,那么本书将为你提供一个快速的、现代的指南,帮助你编码自己的项目。  在两位专业的Mac和iOS应用开发者的引导下,《Objective-C开发经典教程》快速介绍了Objective...
  • Programming in Objective-C, 6th Edition

    千次下载 热门讨论 2013-12-25 10:49:28
    Book Description Updated for OS X 10.9 Mavericks, iOS 7, and Xcode 5 Programming in Objective-C is a concise, carefully written tutorial on the basics of Objective-C and object-oriented programming ...
  • 初识Objective-CObjective-C刚诞生的时候,扩展名.m代表message,它指的是Objective-C的一个主要特性。NSLog( @“ %d ” , 12 ); // 可以输出 12 printf ( “ %d\n ” , 23 ); // 可以输出23 NSLog( @“ %s “ , ...

    初识Objective-C

    Objective-C刚诞生的时候,扩展名.m代表message,它指的是Objective-C的一个主要特性。

    NSLog( @“ %d ” , 12 );  //  可以输出 12
    printf ( “ %d\n ” , 23  ); // 可以输出23
    NSLog( @“ %s “ ,  “abc” ) ; // 可以输出 字符串  abc
    printf ( “%s” ,   “abc” ) ;   // 可以输出  字符串 abc

    “ 数据第一,函数第二 ” 的 编程风格;

    遵循 开放/关闭 的编程原则,封装一个类时,我们能够对其 进行 扩展 而又不必 修改 内部的实现。

    只有代码精简,bug才无处藏身。

    OC不允许在接口里(interface)中对成员变量进行初始化。

    Objective-C 中所有对象间的交互都是通过指针实现的。

    例:(会报错)
    这里写图片描述
    如果用 .mm 做文件扩展名,编译器就会认为你是用Objective-C++编写的代码,这样就可以同时使用 C++ 和 Objective-C来编程了。

    展开全文
  • Using the GNU Compiler Collection Language Standards Supported by GCC GCC支持的语言标准 2.3 Objective-C and ...GCC supports“traditional”Objective-C(also known as“Objective-C 1.0”) and contain

    Using the GNU Compiler Collection

    Language Standards Supported by GCC

    GCC支持的语言标准

    2.3 Objective-C and Objective-C++ Languages

    GCC supports“traditional”Objective-C(also known as“Objective-C 1.0”) and contains support for the Objective-C exception and synchronization syntax.

    GCC支持”传统的” Objective-C(也称为“Objective-C 1.0”),并支持 Objective-C 异常和同步语法。

    It has also support for a number of“Objective-C 2.0”language extensions, including properties, fast enumeration (only for Objective-C),
    method attributes and the @optional and @required keywords in protocols.

    它还支持一些”Objective-C 2.0”语言扩展, 包括属性, 快速枚举(仅适用于Objective-C), 方法属性和协议中的@optional和@required关键字。

    GCC supports Objective-C++ and features available in Objective-C are also available in Objective-C++.

    GCC也支持Objective-C++,Objective-C 中可用的特性同样也可以在 Objective-C++ 中使用。

    GCC by default uses the GNU Objective-C runtime library, which is part of GCC and is not the same as the Apple/NeXT Objective-C runtime library used on Apple systems.

    GCC默认使用GNU Objective-C运行库,它是GCC的一部分,与Apple系统上使用的 Apple/NeXT Objective-C运行时库不同。

    There are a number of differences documented in this manual.

    本手册中记录了若干差异。

    The options‘-fgnu-runtime’and ‘-fnext-runtime’allow you to switch between producing output that works
    with the GNU Objective-C runtime library and output that works with the Apple/NeXT ObjectiveC runtime library.

    选项 '-fgnu-runtime''-fnext-runtime' 允许你在 GNUApple/NeXT Objective-C 运行时库 之间进行切换并产生相应的输出

    There is no formal written standard for Objective-C or Objective-C++.

    Objective-C 或 Objective-C ++并没有正式的书面标准。(意思是没有类似C或C++那种正式发表的语言标准 )

    The authoritative manual on traditional Objective-C (1.0) is “Object-Oriented Programming and the Objective-C Language”: http://www.gnustep.org/resources/documentation/ObjectivCBook.pdf is the original NeXTstep document.

    传统Objective-C(1.0)的权威手册是“面向对象编程和Objective-C语言”:
    http://www.gnustep.org/resources/documentation/ObjectivCBook.pdf 是原始的NeXTstep文档。

    The Objective-C exception and synchronization syntax (that is, the keywords @try, @throw, @catch, @finally and @synchronized) is supported by GCC and is enabled with the option ‘-fobjc-exceptions’.

    GCC支持 Objective-C 异常和同步语法(即关键字@try,@throw,@catch,@finally和@synchronized),并默认启用了选项'-fobjc-exceptions'

    The syntax is briefly documented in this manual and in the Objective-C 2.0 manuals from Apple.

    本手册和Apple的Objective-C 2.0手册中简要介绍了语法。

    The Objective-C 2.0 language extensions and features are automatically enabled;

    Objective-C 2.0 语言扩展和功能自动启用

    they include properties (via the @property, @synthesize and @dynamic keywords),
    fast enumeration (not available in Objective-C++),
    attributes for methods (such as deprecated, noreturn, sentinel, format),
    the unused attribute for method arguments,
    the @package keyword for instance variables and the @optional and @required keywords in protocols.

    它们包括属性(@property,@synthesize 和 @dynamic 关键字),
    快速枚举(在Objective-C ++中不可用),
    方法的属性(如 deprecated,noreturn,sentinel,format),
    未使用的方法参数的属性,
    实例变量的 @package 关键字和协议中的 @optional 和 @required 关键字。

    You can disable all these Objective-C 2.0 language extensions with the option ‘-fobjc-std=objc1’,
    which causes the compiler to recognize the same Objective-C language syntax recognized by GCC 4.0,
    and to produce an error if one of the new features is used.

    您可以使用选项'-fobjc-std = objc1'禁用所有这些 Objective-C 2.0 语言扩展,
    这将导致编译器 与 GCC 4.0 一样来识别 Objective-C 语言语法,并且如果使用某个新功能将会产生错误。

    GCC has currently no support for non-fragile instance variables.

    GCC目前不支持 non-fragile 实例变量。

    The authoritative manual on Objective-C 2.0 is available from Apple:
    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html

    Objective-C 2.0的权威手册可从Apple获得:

    For more information concerning the history of Objective-C that is available online, see http://gcc.gnu.org/readings.html

    有关Objective-C历史的更多信息可以在线获得,详见 http://gcc.gnu.org/readings.html

    展开全文
  • Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition).epub (epub 格式) Want to write iOS apps or desktop Mac applications? This introduction to programming and the Objective-C language is ...
  • objective-c

    千次阅读 2015-09-18 22:15:22
    Objective-C基础教程1-6章节 最近不算很忙,又没有太多深入研究,按照惯例找一些没接触过的新东西看看学习学习,WiEngine,Box2d之后,这次轮到了Objective-C。Objectvie-C随着苹果设备的风靡,也是最热门的技术...

    Objective-C基础教程1-6章节

    最近不算很忙,又没有太多深入研究,按照惯例找一些没接触过的新东西看看学习学习,WiEngine,Box2d之后,这次轮到了Objective-C。Objectvie-C随着苹果设备的风靡,也是最热门的技术之一,无奈之前对C一直存在一些芥蒂,所以没有去接触,不过怎么说语言也是共通的,有些坎肯定还是要迈过的,特别是当下所谓跨Android/iPhone平台,其实都是用C++在开发,所以上上手也是很有必要。

    下面是对看Objective-C基础教程1-6章后,对一些东西的笔记,并不是完整的教程,只是类似拾遗,将一些不同的,不熟悉的东西记下来(和之前Python笔记类似)

    一切都源于Hello World 恒古不变的定律,熟悉一门语言结构最快也就是这个万能的程序了,Objective-C扩展名为.m(之后书中也有提到.mm就是C++风格)

     

    Objective-c代码  收藏代码
    1. #import <Foundation/Foundation.h>  
    2. int main(int argc, const char *argv[]){  
    3.     NSLog(@"Hello Objective-C");  
    4.     return (0);  
    5. }  

     

    其中NSLog方法是Objective-C专属的一种类型,所有cocoa的对象都被冠以了NS前缀,作为区分。传入的参数@""表示字符串作为NSString被处理,程序其余部分和C类似,#import的含义也不言而喻

    布尔值

    Objective-C中的布尔变量有些许小的不同,参数类型为BOOL,值为YES/NO,其中YES为1,NO为0,占8位

    需要注意的是,如果将一个int,short这样的值赋给BOOL,只有低位字节会发挥作用,这是特别要注意的,因为这意味着,并不是传统认为的,非零即为true

    Objective-C中有一种特有的语法:[对象 操作] 这在之后会一直看到

    关于Objective-C中的OOP

    @interface

    至少目前我还将其于java中的接口相类比,名称也一样,但是有人告诉我Objective-C中的interface并不同于接口,而类似于接口的Objective-C中有一个叫做协议的东西,这个以后看到了我会再加以对比区分

     

    Objective-c代码  收藏代码
    1. @interface Circle:NSObject  
    2. {  
    3.     ShapeColor color;  
    4.     ShapeRect bounds;  
    5. }  
    6. -(void) setFillColor: (ShapeColor) color;  
    7. -(void) setBounds: (ShapeRect) bounds;  
    8. -(void) draw;  
    9. @end  

     

    以上就是标准的一个@interface定义,应该很好理解,Circle含有2个变量color,bounds,拥有3个方法

    特别注意方法的申明方式 

    (void) 表示返回类型 之后是方法名及参数

    draw方法不含参数 也不用:

    对于多个参数的方法申明

    -(void) setTire: (Tire *) tire atIndex:(int) index;(这里的第二个参数看起来有些奇怪,但是在之后调用方法的过程中,atIndex会被用到)

    Objective-C的方法调用使用了一种被称为中缀符的东西

    看一下分别调用无参,1参和多参的语法

     

    Objective-c代码  收藏代码
    1. [circle draw];  
    2. [circle setFillColor:kRedColor];  
    3. [car setTire:tire atIndex:2];<span> </span>  

     

    @implementation

    与名字相同,实现,就是对@interface所申明内容的具体实现

     

    Objective-c代码  收藏代码
    1. @implementation  
    2. -(void) setFillColor:(ShapeColor c)  
    3. {  
    4.     color=c;  
    5. }  
    6. @end  

     

    这里的color=c其实就相当于self.color=c(这里我又要做类比了,目前的认识self就相当于java中的this指针)

    有了@interface和@implementation之后,我们对一个类(对象)的定义就算完成,那么如何实例化一个对象

     

    Objective-c代码  收藏代码
    1. id shapes[3];  
    2. shapes[0]=[Circle new];  
    3. [shpaes[0] setBounds:rect];  
    4. ...  

     

    这里又看到一个新的东西id,它是一种指向某个对象的指针,目前为止只是看到这一种用法,也没有太多认识,简单的被我理解成了索引

    之后看到了new对象的方法[Circle new],再之后是调用对象的方法设置具体的参数

    继承

     

    Objective-c代码  收藏代码
    1. @interface Circle:Shape  

     

    很简单的方法,Objective-C在继承规则上于java,C#无异,不允许多重继承,不过既然有接口(或者应该叫协议),那么自然同java一样,达到相同的目的自然不难,同样的,子类可以调用父类的方法,通过super,比如[super setColor:c];

    Ojbective-C中的空值为nil

    接下来 来看一个Car是被如何自动构建的

     

    Objective-c代码  收藏代码
    1. @implementation Car  
    2. -(id) init  
    3. {  
    4.     if(self=[super init]){  
    5.         engine=[Engine new];  
    6.         ...  
    7.     }  
    8.     return (self);  
    9. }  

     

    这一段有些理解不能,在书中的注释中说到,这里指如果超类可以完成所需的一次性初始化,需要调用[super init]。init方法的返回值id描述了倍初始化的对象。将[super init]的结果赋给self是Objective-C的标准惯例。

    Objective-C中一样有getter/setter方法,但是在命名规则上需要注意

     

    Objective-c代码  收藏代码
    1. -(Engine *)engine;  
    2. -(void) setEngine: (Engine *) engine;  

     

    在set方法中 依然采取setXXX的方式 但是get方法则直接采用XXX 而非getXXX,以免混淆

    拆分

    一般将@interface部分放入.h文件中

     

    Objective-c代码  收藏代码
    1. #import <Cocoa/Cocoa.h>  
    2. @interface Tire:NSObject  
    3. @end  

     

    将其他部分放在.m中,在.m中记得引入该头文件

    #import "Tire.h"

    import下<>代表系统头文件 ""代表本地头文件

    关键词@class 告诉编译器此处是一个类,还需要通过指针进行传递

    Objective-c代码  收藏代码
    1. @class Tire  
    2. @class Engine  
    3. ...  
    4. Engine *engine  

    注意这只有在通过指针指向其他类的情况下可用,减少编译器负担,在继承的情况下不可用,因为他需要了解超类的信息



    ----------------------------------------------

    Foundation Kit

    Cocoa由两个不同的框架组成 Foundation Kit和Application Kit

    Foundation框架中有很多诸如NSString,NSArray等低级类和数据类型

     

     

    Objective-c代码  收藏代码
    1. #import <Foundation/Foundation.h>  
    2. int main(int argc, const char *argv[]){  
    3.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];  
    4.     //insert code here...  
    5.     NSLog(@"Hello, World!");  
    6.       
    7.     [pool drain];  
    8.     return 0;  
    9. }  

     

    通过alloc创建并通过init初始化了一个池,在结尾处排空,这是Cocoa内存管理的预览

     

    一些有用的数据类型

     

    范围 NSRange

     

    Objective-c代码  收藏代码
    1. typedef struct _NSRange{  
    2.     unsigned int location;  
    3.     unsigned int length;  
    4. }NSRange;  

     

    表示相关事物的范围,如字符串中的字符范围或数组中的元素范围

    创建一个新的NSRange有3种方式

     

    Objective-c代码  收藏代码
    1. //1  
    2. NSRange range;  
    3. range.location=17;  
    4. range.length=4;  
    5. //2  
    6. NSRange range={17,4};  
    7. //3  
    8. NSRange range=NSMakeRange(17,4);  

     

    第三种方法的好处是可以在任何能够使用函数的地方使用,比如当作参数

     

    Objective-c代码  收藏代码
    1. [anObject flarbulateWithRange: NSMakeRange(13,15)];  

     

     

    几何数据类型 NSPoint,NSSize

     

    Objective-c代码  收藏代码
    1. typedef struct _NSPoint{  
    2.     float x;  
    3.     float y;  
    4. }NSPoint;  
    5.   
    6. typedef struct _NSSize{  
    7.     float width;  
    8.     float height;  
    9. }NSSize;  

     

    比如Cocoa提供了矩形数据类型

     

    Objective-c代码  收藏代码
    1. typedef struct _NSRect{  
    2.     NSPoint origin;  
    3.     NSSize size;  
    4. }NSRect;  

     

    同样提供了NSMakePoint(),NSMakeSize(),NSMakeRect()方法

    将这些数据类型作为struct而不是对象的好处是性能更高

     

    字符串 NSString

    创建字符串

     

    Objective-c代码  收藏代码
    1. NSString *height;  
    2. height=[NSString stringWithFormat: @"Your height is %d feet",5];  

     

    类方法

    我们所创建的大部分方法是实例方法 用前导减号 - 声明

    如果方法用于实现常规功能,用前导加好 + 来声明类方法

    就如NSString的stringWithFormat方法

     

    Objective-c代码  收藏代码
    1. + (id) stringWithFormat: (NSString *) format, ...;  

     

    关于大小

     

    Objective-c代码  收藏代码
    1. - (unsigned int) length;  

     

    使用方式

     

    Objective-c代码  收藏代码
    1. unsigned int length=[height length];  

     

    该方法可以正确处理国际字符串

    比较

     

    Objective-c代码  收藏代码
    1. isEqualToString  
    2. - (BOOL) isEqualToString: (NSString *) aString;  

     

    使用方式

     

    Objective-c代码  收藏代码
    1. NSString *thing1=@"hello 5";  
    2. NSString *thing2;  
    3. thing2=[NSString stringWithFormat: @"hello %d",5];  
    4. if(thing1 isEqualToString: thing2]){  
    5.     NSLog(@"They are the same!");  
    6. }  

     

    同样的compare方法

     

    Objective-c代码  收藏代码
    1. - (NSCompar isonResult) compare: (NSString *) string;  

     

    返回一个NSComparisonResult枚举类型

    Objective-c代码  收藏代码
    1. type enum _NSComparisonResult{  
    2.     NSOrderedAscending=-1,  
    3.     NSOrderedSame,  
    4.     NSOrderedDescending  
    5. }NSComparisonResult;  

    如果返回NSOrderedAscending 表示左侧小于右侧 其他类似

    不区分大小写的比较

    Objective-c代码  收藏代码
    1. - (NSComparisonResult) compare: (NSString *) string  
    2.                         options: (unsigned) mask;  

    options参数是一个掩码

    NSCaseInsensitiveSearch 不区分大小写

    NSLiteralSearch 完全比较,区分大小写

    NSNumericSearch 比较字符个数而不是字符值 比如100应该排在99以后

    Objective-c代码  收藏代码
    1. if([thing1 compare: thing2  
    2.         options: NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame){  
    3.             NSLog(@"They match");  
    4.         }  

    判断字符串内是否包含其他字符串

    Objective-c代码  收藏代码
    1. - (BOOL) hasPrefix: (NSString *) aString;  
    2. - (BOOL) hasSuffix: (NSString *) aString;  

    分别检查以特定字符串开头和结尾

    Objective-c代码  收藏代码
    1. - (NSRange) rangeOfString: (NSString *) aString;  

    返回匹配的位置,如果找不到 则range.start=NSNotFound

     

    可变性

    NSString是不可变的

    NSMutableString是可变字符串

    两者间比较类似Java中的String和StringBuffer

    创建NSMutableString的方法

    Objective-c代码  收藏代码
    1. + (id) stringWithCapacity: (unsigned) capacity;  

    该容量只是一个建议 

    Objective-c代码  收藏代码
    1. NSMutableString *string;  
    2. string = [NSMutableString stringWithCapacity: 42];  

    可以使用一些方法操作该string

    Objective-c代码  收藏代码
    1. - (void) appendString: (NSString *) aString;  
    2. - (void) appendFormat: (NSString *) format, ...;  

    使用起来非常方便 也很显而易见

    Objective-c代码  收藏代码
    1. NSMutableString *string;  
    2. string=[NSMutableString stringWithCapacity: 50];  
    3. [string appendString: @"Hello here"];  
    4. [string appendFormat: @"human %d!",39];  
    5. //得到最后结果Hello here human 39!  

    类似的

    删除字符串中的字符

    Objective-c代码  收藏代码
    1. - (void) deleteCharactersInRange: (NSRange) range;  

    NSMutableString是NSString的子类,所以可以使用NSString的所有功能

    因此同样可以使用stringWithFormat来创建NSMutableString

     

    集合家族 NSArray NSDictionary等

    NSArray可以放入任意类型的对象

    两个限制

    1 只能存储Objective-C对象,而不能是C基础类型int,float,enum,struct等

    2 不能存储零值nil NULL值

    可以通过类方法arrayWithObjects创建,以逗号分割对象列表,并最后以nil表示列表结束

    Ojbective-c代码  收藏代码
    1. NSArray *array;  
    2. array=[NSArray arrayWithObjects: @"one",@"two",@"three",nil];  

    获得对象个数

    Objective-c代码  收藏代码
    1. - (unsigned) count;  

    取得特定索引处对象

    Objective-c代码  收藏代码
    1. - (id) objectAtIndex: (unsigned int) index;  

    例如遍历一个数组

    Objective-c代码  收藏代码
    1. int i;  
    2. for(i=0;i<[array count];i++){  
    3.     NSLog(@"index %d has %@",i,[array objectAtIndex: i]);  
    4. }  

    字符串切分成数组

    Objective-c代码  收藏代码
    1. -componentsSeparatedByString  

    数组合并成字符串

    Objective-c代码  收藏代码
    1. -componentsJoinedByString  

    可变数组

    NSArray是不可变的,类似的NSMutableArray可变

    创建新的可变数组

    Objective-c代码  收藏代码
    1. + (id) arrayWithCapacity: (unsigned) numItems;  

    数组末尾添加对象

    Objective-c代码  收藏代码
    1. - (void) addObject: (id) anObject;  

    删除特定位置对象

    Objective-c代码  收藏代码
    1. - (void) removeObjectAtIndex: (unsigned) index;  

    枚举 NSEnumerator

    通过objectEnumerator向数组请求枚举器

    Objective-c代码  收藏代码
    1. - (NSEnumerator *) objectEnumerator;   

     这似乎类似于Java的迭代器Iterator

    使用

    Objective-c代码  收藏代码
    1. NSEnumerator *enumerator;  
    2. enumerator=[array objectEnumerator];  

    可以从后向前浏览集合 reverseObjectEnumerator

    请求下一个对象

    Objective-c代码  收藏代码
    1. - (id) nextObject;  

    返回nil时表示结束

    快速枚举

    Objective-c代码  收藏代码
    1. for(NSString *string in array){  
    2.     NSLog(@"I found %@",string);  
    3. }  
     

    NSDictionary 有些类似于Map(散列表,关联数组)

    类似的NSDictionary不可变,可变的NSMutableDictionary

    创建字典的方法

    Objective-c代码  收藏代码
    1. + (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;  

    例如

    Objective-c代码  收藏代码
    1. Tire *t1=[Tire new];  
    2. Tire *t2=[Tire new];  
    3. Tire *t3=[Tire new];  
    4. Tire *t4=[Tire new];  
    5.   
    6. NSDictionary *tires;  
    7.   
    8. tires=[NSDictionary dictionaryWithObjectsAndKeys: t1, @"front=left", t2, @"front-right", t3, @"back-left", t4, @"back-right", nil];  

    使用objectForKey来获取值

    Objective-c代码  收藏代码
    1. - (id) objectForKey: (id) aKey;  

    例如查找右后轮胎

    Objective-c代码  收藏代码
    1. Tire *tire=[tires objectForKey: @"back-right"];  

    同样的,对于可变的字典

    Objective-c代码  收藏代码
    1. + (id) dictionaryWithCapacity: (unsigned int) numItems;  

    为可变字典添加元素

    Objective-c代码  收藏代码
    1. - (void) setObject: (id) anObject forKey: (id) aKey;  

    如果当前已有值,则新值会替代原有的值

    删除

    Objective-c代码  收藏代码
    1. - (void) removeObjectForKey: (id) aKey;  

    使用但不扩展

    不要自己去创建NSString,NSArray,NSDictionary的子类

     

    各种数值

    就和Java中对int,float等有Integer,Float等对象封装,Objectvie-C也提供了NSNumber的包装类

    Objective-c代码  收藏代码
    1. + (NSNumber *) numberWithChar: (char) value;  
    2. + (NSNumber *) numberWithInt: (int) value;  
    3. + (NSNumber *) numberWithFloat: (float) value;  
    4. + (NSNumber *) numberWithBool: (BOOL) value;  

    类似的还有long,long long等

    例如将一个包装后的数据放入数组

    Objective-c代码  收藏代码
    1. NSNumber *number;  
    2. number=[NSNumber numberWithInt: 42];  
    3. [array addObject: number];  
    4. [dictionary setObject: num forKey: @"Bork"];  

    从包装类获取值

    Objective-c代码  收藏代码
    1. - (char) charValue;  
    2. - (int) intValue;  
    3. - (NSString *) stringValue;  

     等

     

    NSValue

    NSNumber是NSValue的子类,NSValue可以包装任意值

    Objective-c代码  收藏代码
    1. + (NSValue *) valuseWithBytes: (const void *) value  
    2.     objCType: (const char *) type;  

    例如,将NSRect放入NSArray

    Objective-c代码  收藏代码
    1. NSRect rect=NSMakeRect(1,2,3,4);  
    2.   
    3. NSValue *value;  
    4. value=[NSValue valueWithBytes: &rect  
    5.     objCType: @encode(NSRect)];  
    6. [array addObject: value];  

    这里使用@encode编译器指令,它可以接受数据类型的名称并转化为合适的字符串

    使用getValue取值

    Objective-c代码  收藏代码
    1. - (void) getValue: (void *) value;  

    传递的是存储该数值的变量地址

    Objective-c代码  收藏代码
    1. value=[array objectAtIndex: 0];  
    2. [value getValue: &rect];  

    Cocoa提供了常用的将struct型数据转换成NSValue的方法

    Objective-c代码  收藏代码
    1. + (NSValue *) valueWithPoint: (NSPoint) point;  
    2. + (NSValue *) valueWithSize: (NSSize) size;  
    3. + (NSValue *) valueWithRect: (NSRect) rect;  
     

    Objective-c代码  收藏代码
    1. - (NSPoint) pointValue;  
    2. - (NSSize) sizeValue;  
    3. - (NSRect) rectValue;  

    例如,在NSArray中存储和检索NSRect

    Objective-c代码  收藏代码
    1. value=[NSValue valueWithRect: rect];  
    2. [array addObject: value];  
    3. ...  
    4. NSRect anotherRect=[value rectValue];  
     

    NSNull

    之前提到nil在NSArray和NSDictionary中有特殊的含义,所以不能把nil放入其中,如果要真的表示没有,Objectvie-C提供了NSNull

    使用[NSNull null]==来比较是否为空



    --------------------------------------------------------


    完全是按照书上章节的顺序来的 这次是第九章的内容 关于内存管理

    作为一名一直写java,当初就是因为java的自动垃圾回收机制,于是偷懒投奔java阵营的来说,这次不得不又回过头来面对这个问题了。后面的笔记只是对书中一些内容的记录总结,由于没有实战,具体使用中会碰到什么问题还是不得而知,而且我想那一定会存在相当多的问题,好在最后给出的三条准则还是非常易用的。(听同伴说xCode提供了检查内存泄露的工具,挺好用)

    本章最后提到了Objective-C也同样可以打开垃圾回收,不过由于只对高版本有效,并非通用,所以个人感觉既然使用了Objective-C,因此还是应该掌握内存管理的方法。

     

    对象的声明周期:

    诞生(通过alloc或new)、实现(接收消息和执行操作)、交友(借助方法的组合和参数)、死去(被释放)

    Cocoa使用引用计数

    当使用alloc,new或者copy方法创建一个对象时,计数器值设为1

    发送retain消息增加计数器值,减少使用release

    当计数器归0,Objective-C自动发送dealloc消息,可以重写dealloc方法,但是不要直接去调用该方法

    发送retainCount消息获得当前计数器值

     

    Objective-c代码  收藏代码
    1. - (id) retain;  
    2. - (void) release;  
    3. - (unsigned) retainCount;  
     

     

    Objective-c代码  收藏代码
    1. [[car retain] setTire:tire at Index:2];  

    表示要求car对象将计数器加1,并执行setTire操作

     

    一种set方法的正确内存管理方法

     

    Objective-c代码  收藏代码
    1. - (void) setEngine: (Engine *) newEngine{  
    2.     [newEngine retain];   
    3.     [engine release];  
    4.     engine=newEngine;  
    5. }  
     

    自动释放池

    NSObject类提供了autorelease方法

     

    Objective-c代码  收藏代码
    1. - (id) autorelease;  

    执行后对象将被添加到自动释放池中,自动释放池被销毁时,向其中所有对象发送release消息

     

    Cocoa内存管理规则

    * 当使用new,alloc,copy方法创建一个对象时,该对象保留计数器为1,如果不再使用该对象,需要手动发送release或autorelease消息

    * 通过其他方式获得的对象,则假设该对象计数器为1,并以设置自动释放,不需要做任何事,如果需要在一段时间内使用,那么保留该对象并确保在工作完成后释放

    * 如果保留了某个对象,最终需要手动释放该对象,保持retain和release使用次数相等

     

    例如

    临时对象

     

    Objective-c代码  收藏代码
    1. NSMutableArray *array;  
    2. array=[[NSMutableArray alloc] init];  
    3. //...use array...  
    4. [array release];  

    使用了alloc获得对象,所以用完需要释放

     

     

    Objective-c代码  收藏代码
    1. NSMutableArray *array;  
    2. array=[NSMutableArray arrayWithCapacity:17];  
    3. //use it, autorelease  

    注意这里使用了arrayWithCapacity获得对象,并不是3者之一,所以无需做任何事

     

     

    Objective-c代码  收藏代码
    1. NSColor *color;  
    2. color=[NSColor blueColor];  

    和上述情况相同,其实这里的blueColor是一个全局单例对象,永远不会被销毁

     

    拥有对象

     

    Objective-c代码  收藏代码
    1. - (void) doStuff{  
    2.     //flonkArray is an instance variable  
    3.     flonkArray=[NSMutableArray new];  
    4. }  
    5. - (void) dealloc{  
    6.     [flonkArray release];  
    7.     [super dealloc];  
    8. }  
     

     

     

    Objective-c代码  收藏代码
    1. - (void) doStuff{  
    2.     //flonkArray is an instance variable  
    3.     flonkArray=[NSMutableArray arrayWithCapacity: 17];  
    4.     [flonkArray retain];  
    5. }  
    6. - (void) dealloc{  
    7.     [flonkArray release];  
    8.     [super dealloc];  
    9. }  

    展开全文
  • Objective-C通过一套全新的语法,在C语言基础上添加了面向对象特性。OC的语法中频繁使用方括号,而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长。这是这样写出来的代码非常易读,只是C++和Java...

        Objective-C通过一套全新的语法,在C语言基础上添加了面向对象特性。OC的语法中频繁使用中括号[  ],而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长。这是这样写出来的代码非常易读,只是C++和Java程序员不太适应。

        OC语言学起来很快,但有很多微妙细节需要注意,而且还有许多容易为人所忽略的特性。另一方面,有些开发者并未完全理解或是容易滥用某些特性,导致写出来的代码难以维护,难以调试。本章讲解基础知识,后续各章语言及其相关架构的各个特定话题。

    第1条:了解OC语言的起源

        OC与C++,Java等面向对象语言类似,不过很多方面有差别。若是用过另一种面向对象语言,那么就能理解OC所用的许多范式与模板了。然而语法上也许会显得陌生,因为OC使用消息结构(messaging structure)而非函数调用(function calling)。OC由SmallTalk演化而来,后者是消息型语言的鼻祖。消息与函数调用之间的区别看上去就像这样:

    //Messaging (OC)
    Object *obj = [Object new];
    [obj perfromWith:parameter1 and:parameter2];
    
    //Function calling(C++)
    Object *obj = new object;
    obj->perform(parameter1,parameter2);

        关键区别在于:使用消息结构的语言,其运行时所应执行的代码由运行环境决定;而使用函数调用的语言,由编译器决定。如果范例代码中调用函数是多态的,那么在运行时就要按照“虚函数表”(virtual table)来查找到底应该执行哪个函数。而采用消息结构的语言,不论是否多态,总是在运行时才会去查找所要执行的方法。实际上,编译器甚至不关心接受消息的对象是何种类型。接受消息的对象问题也要在运行时处理,其过程叫做“动态绑定”(dynamic binding)见第11条

        OC的重要工作都由“运行期组件”(runtime component)而非编译器来完成。使用OC的面向对象特性所需的全部数据结构及函数都在运行期组件里面。举例来说,运行期组件中含有全部内存管理方法。运行期组件本质上就是一种与开发者所编代码相链接的“动态库”(dynamic library),其代码能把开发者编写的所有程序战粘和起来。这样,只需更新运行期组件,即可提升应用程序性能。

         OC是C的超集,所以C语言中的所有功能在编写OC代码时依然适用。

         OC只能在堆上声明变量,不能在栈上声明(CGRect可以声明在栈上,因为CGRect是C结构体),OC将堆内存管理抽象出来了。不需要malloc及free来分配或释放对象所占内存。OC运行期环境把这部分工作抽象为一套内存管理架构,名叫“引用计数”,见第29条

    第2条:在类的头文件中尽量少引入其他头文件

        与C和C++一样,OC使用头文件与“实现文件”来区隔代码。用OC语言编写任何类几乎都要引入Foundation.h。

        尽量在头文件中使用类声明,防止循环头文件引用,过多的引用头文件也会增加编译时间。

    第3条:多用字面量语法,少用与之等价的方法

    举例:

    NSNumber *someNumber = @1;
    NSNumber *intNumber = @1;
    NSNumber *floatNumber = @2.5f;
    NSArray * animals = @[@"cat",@"dog",@"mouse",@"badger"];
    NSString *dog = animals[1];
    //----------------------
    id object1 = /*......*/;
    id object2 = /*......*/;
    id object3 = /*......*/;
    NSArray* arrayA = [NSArray ArrayWithObjects:object1,object2,object3,nil];
    NSArray* arrayB = @[object1,object2,object3];
    //如果object2 = nil那么arrayB抛出异常,array中只有object1和object2。
    //----------------------
    NSDictionary *personData = @{@"firstName":@"Matt",@"lastName":@"Galloway",@"age":@28};

    第4条:多用类型常量,少用#define预处理指令

        编写代码经常需要定义常量。例如:

    #define ANIMATION_DURATION 0.3

        #define会编译期简单替换文本,会造成很多不必要的麻烦。要像解决此问题,应该设法利用编译器的某些特性才行。比如:

    static const NSTimeInterval kAnimationDuration = 0.3;

        这种方式定义常量包含了类型信息,且最好将这个声明放到.m文件中。static const的声明不应该出现在头文件里。因为OC没有命名空间,所以那样就等于声明了一个全局变量。static修饰表示该变量仅定义在此.m文件中(一个编译单元),如果不加static,则编译器会为他创建一个“外部符号”(external symbol)。此时若另外一个.m文件也有了同名变量,就会造成符号重复(duplicate symbol)。

        实际上,如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会像#define一样预处理指令一样,把所有遇到的变量都替换为常量。

        有时候需要对外公开某个常量,例如:

    //in the header file
    extern NSString *const EOCStringConstant;
    //in the implement file
    NSString* const EOCStringConstant = @"VALUE";

        EOCStringConstant是一个常量指针,编译器会看到头文件中的extern关键字,这个关键字是要告诉编译器,在全局符号表中将会有有一个名叫EOCStringConstant的符号。当链接成二进制文件之后,肯定能找到这个常量。因为符号要放在全局符号表里,所以命名常量时需谨慎。

    本节要点:

    ● 不要用预处理指令定义常量。即使有人重新定义了常量值,编译器页不会产生警告信息,这将导致程序中常量不一致。

    ● 在实现文件中使用static const来定义“只在编译单元内可见的常量”(translation-unitspecific constant)。此类常量不在全局符号表中。

    ● 在头文件中使用extern来声明全局常量,并在实现文件中定义其值。

    第5条:用枚举表示状态、选项、状态码

        直接举例    

    typedef NS_ENUM(NSUInteger,EOCConnectionState){
        EOCConectionStateDisconnected,
        EOCConectionStateConnecting,
        EOCConectionStateConnected,
    };

    ● 用NS_ENUM与NS_OPTIONS宏来定义枚举类型,并指明底层数据类型。这样做可以确保枚举是开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型。


    其余章节点击这里

    展开全文
  • Objective-C

    千次阅读 2012-04-26 20:28:43
    Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在...
  • Objective-C 局部变量的值只在方法运行时才存在并且只能在定义它们的方法中访问。局部变量没有默认的初始值,所以在使用前要先赋值。并且和实例变量不同,这些局部变量不存在于内存中,也就是说,当方法返回时,...
  • Objective-C不是一个复杂的语言,虽然有些术语比较怪异,但是它用起来还是比较简单的。   Objective-C中的面向对象编程(OO) 对象Objects 对象必然是OO中最基本的元素,一个对象可以接收消息并...
  • IOS的学习笔记之Objective-C style guide. 转至元数据结尾 创建:张坤楠,最新修改于:二月 26, 2016 转至元数据起始 前言 http://10.9.10.115/svn/client/component/ios/ 学习计划:了解...
  • 改定履历: 2012-05-07---------------新建文本...1. 确认objective-c对象是否是一个类的实例: [obj isMemberOfClass:someClass]; 2. 确认objective-c对象是否是一个类的实例或是其子孙. [obj isKindOfCl
  • <p>Apple mentioned that they could co-exist in one application, but does this mean that one could technically re-use old classes made in Objective-C whilst building new classes in Swift? <h1>The ...
  • Effective-Objective-C学习笔记1-熟悉Objective-C最近由于实习需求,开始学习Objective-C,之前浏览过一遍Objective-C基础教程,现在在看Effective-Objective_C,这是自己的一些总结。总结只是个人的一些看法,大家...
  • 改定履历: 2012-05-10-------------新建文本文档 ...Objective-C 类的 interface 1. 声明实例变量和公有方法: MyString.h #import @interface MyString : NSObject { // Declare instanc
  • 改定履历: 2012-05-07---------新建文本文档 ...objective-c日志消息: NSLog ( @"Logging message: %@", [myObject myMehtod] ); 2. objective-c循环 用一个循环遍历objective-c数组: NSArray *myList
  • 该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。 第一条:了解Objective-C语言的起源 同C++类似,Objective-C也是C语言进行面相对象化的扩展。二者存在一个根本性的...
  • Objective-C 2.0 下一个很方便的功能:自动生成设置函数方法和获取函数方法 (统称为存取器方法)。 第一步是在接口部分中实用 @property 指令标识属性。这些属性通常是实例变量。在前文 《Objective-C 分离...
  • 续前面的Objective-C的第一个程序 HelloWorld,这里Mike进一步介绍如何实现分行文字输出。 首先是范例2-2,增加新的一行NSLog以显示更多的内容: 01 #import 02  03 int main (int argc, con
  • 在介绍完 Objective-C 中的四大基本类型之一 int 类型 后,接下来不得不提的就是 float 类型。声明为 float 类型的变量可存储包含小数位的值。要区分浮点常量,可通过查看其是否包含小数点。可以省略小数点...
  • 今天 Mike 要和大家聊下在 Objective-C 中的 int 数据类型,整数常量由一个或多个数字的序列组成。序列前的负号表示该值是一个负数。值 168,-12 和 0 都是合法的整数常量。数字中间不允许插入空格,大于 999 的...
  • Objective-C征途:Hello Objective-C

    千次阅读 2012-06-08 11:43:04
    先来介绍一下历史背景,Cocoa和Objective-C是苹果公司Mac OS X操作系统的核心。虽然Mac OS X相对较新,但Objective-C和Cocoa的推出已有时日。早在20世纪80年代早期,Bard Cox就发明了Objective-C,意在将流行的,可...
  • iOS开发之Objective-C编程基础

    万人学习 2015-06-25 13:51:14
    本系列课程视频提供iOS培训之Objective-C基础视频,第一个Obj-C程序 Hello world,面向对象编程,面向过程编程,类和对象,self使用详解, property基础,synthesize基础,propertyNam,Property的setter和getter,...
  • Objective-C 语言允许你使用非常简便的语法访问属性。要获得 myFraction 中存储的 numerator 的值,可使用以下语句: [myFraction numerator] 这会向 myFraction 对象发送 numerator 消息

空空如也

1 2 3 4 5 ... 20
收藏数 48,339
精华内容 19,335
关键字:

objective-c