`

Obj-C中的关键字

 
阅读更多

原文:http://www.learn-cocos2d.com/2011/10/complete-list-objectivec-20-compiler-directives/

@class

Used for class forward declarations. Declares class as known without having to import the class’ header file.

@class ClassName;

Note, unlike with @protocol and @selector you can not write the following to get the Class object by name:

// ERROR: this doesn't work!
Class c = @class(ClassName);

Instead use:

Class c = [ClassName class];

@defs

The @defs directive returns the layout of an Objective-C class, it allows you to create a C struct with the same layout as the Objective-C class. If you don’t know yet, Objective-C classes are basically just C structs with additional methods. Makes sense if you consider that Objective-C is merely a set of extensions to the C language.

struct { @defs( NSObject) }

You will only ever need @defs for some hardcore, low-level Objective-C operations or optimizations, as in this article which speeds up Objective-C message sends.

@protocol @required @optional @end

Marks the start of a protocol declaration. A @protocol can optionally declare that it must conform to other protocols.

@protocol ProtocolName <aProtocol, anotherProtocol>
@required
  // method declarations
@optional
  // method declarations
@end

Like with @selector you can use @protocol to get a protocol object by name:

-(void) aMethod
{
    Protocol *aProtocol = @protocol(ProtocolName);
}

Dependent Directives:

  • @required (default) – Declares the methods following the @required directive as required (default).
  • @optional – Declares the methods following the @optional directive as optional. Classes implementing this protocol can decide whether to implement an optional method or not. Classes making use of the protocol must test optional protocol methods for existence. For example:
    [object respondsToSelector:@selector(optionalProtocolMethod)];
  • @end – Marks the end of the protocol declaration.

@interface @public @package @protected @private @property @end

Marks the start of a class or category declaration.

Class declaration:

While SuperClassName is optional, Objective-C classes should derive from NSObject either directly or indirectly. The @interface for a class declaration can optionally declare that it conforms to other protocols.

@interface ClassName : SuperClassName <aProtocol, anotherProtocol>
{
@public
  // instance variables
@package
  // instance variables
@protected
  // instance variables
@private
  // instance variables
}

// property declarations
@property (atomic, readwrite, assign) id aProperty;

// public instance and/or class method declarations
@end

Category declaration:

The @interface of a Objective-C category can not add instance variables. But it can optionally declare to conform to (additional) protocols. CategoryName can be omitted (leaving only the empty brackets) if the category is added to the implementation file of the class that it extends, in order to declare methods as “private”.

@interface ClassName (CategoryName) <aProtocol, anotherProtocol>

// property declarations
@property (atomic, readwrite, assign) id aProperty;

// method declarations
@end

Dependent Directives:

  • @public – Declares the instance variables following the @public directive as publicly accessible. Public instance variables can be read and modified with pointer notation:
    someObject->aPublicVariable = 10;
  • @package – Declares the instance variables following the @package directive as public inside the framework that defined the class, but private outside the framework. This applies only to 64-bit systems, on 32-bit systems @package has the same meaning as @public.
  • @protected (default) – Declares the instance variables following the @protected directive as accessible only to the class and its derived classes.
  • @private – Declares the instance variables following the @private directive as private to the class. Not even derived classes can access private instance variables.
  • @property – Declares a property which can be accessed with dot notation. The @property can be followed by optional brackets within which special keywords (property modifiers) specify the exact behavior of the property. The property modifiers are:
    • readwrite (default), readonly – Generate both setter & getter methods (readwrite), or only the getter method (readonly).
    • assign (default), retaincopy – Only applicable for properties that can be safely cast to id. Assign simply assigns the passed value – retain sends release to the existing instance variable, sends retain to the new object, assigns the retained object to the instance variable – copy sends release to the existing instance variable, sends copy to the new object, assigns the copied object to the instance variable. In the latter two cases you are still responsible for sending release (or assigning nil) to the property on dealloc.
    • atomic (default), nonatomic – Atomic properties are thread-safe, nonatomic properties are prone to synchronization issues if accessed from multiple threads. Nonatomic property access is faster than atomic and often used in single-threaded apps, or in cases where you’re absolutely sure the property will only be accessed from one thread.
    • weak (default), strong – Available if automatic reference counting (ARC) is enabled. The keyword strong is synonymous to retain, while weak is synonymous to assign, except that a weak property is automatically set to nil should the instance be deallocated. Note thatweak is only available in iOS 5 or newer and Mac OS X 10.7 (Lion) or newer.
  • @end – Marks the end of the interface declaration.

@implementation @synthesize @dynamic @end

Marks the start of a class’ or category implementation.

Class implementation:

@implementation ClassName
@synthesize aProperty, bProperty;
@synthesize cProperty=instanceVariableName;
@dynamic anotherProperty;

// method implementations
@end

Category implementation:

@implementation ClassName (CategoryName)
@synthesize aProperty, bProperty;
@synthesize cProperty=instanceVariableName;
@dynamic anotherProperty, bnotherProperty;

// method implementations
@end

Dependent Directives:

  • @synthesize – Instruct compiler to automatically generate property setter and getter methods for the given (comma seperated list of) properties. The setter and getter methods are generated according to the property modifiers. If the instance variable is not named exactly like the@property, you can specify the instance variable name following the equals sign.
  • @dynamic – Tells the compiler that the necessary setter and getter methods for the given (comma seperated list of) properties will be implemented manually, or dynamically at runtime. Accessing a dynamic property will not generate a compiler warning, even if the getter/setter is not (yet) implemented. You will want to use @dynamic in cases where property getter and setter methods need to perform custom code.
  • @end – Marks the end of the implementation of the class.

@throw @try @catch @finally

Used for handling and throwing exceptions.

Throwing and Handling exceptions:

@try
{
    // code that might throw an exception … like this one:
    NSException *exception = 
        [NSException exceptionWithName:@"ExampleException"
                                reason:@"In your face!"
                              userInfo:nil];
    @throw exception;
}
@catch (CustomException *ce)
{
    // CustomException-specific handling ...
}
@catch (NSException *ne) 
{
    // generic NSException handling ...

    // to simply re-throw the caught exception in a catch block:
    @throw;
}
@finally 
{
    // code that runs whether an exception occurred or not ...
}

@synchronized

Encapsulates code in a mutex lock. It ensures that the block of code and the locked object can only be accessed by one thread at a time. See mutual exclusion.

-(void) aMethodWithObject:(id)object
{
   @synchronized(object)
   {
      // code that works with locked object 
   }
}

@autoreleasepool

In an app that has ARC (automatic reference counting) enabled, you must use @autoreleasepool as a replacement for the NSAutoreleasePool class. The @autoreleasepool is about six times faster than using NSAutoreleasePool, therefore Apple recommends its use even for non-ARC projects.

You should not declare a variable inside the @autoreleasepool block and continue to use the variable after the @autoreleasepool block. Such code should be avoided or refactored.

-(void) aMethod
{
    @autoreleasepool
    {
        // code that creates a large number of temporary objects
    }
}

@selector

Returns the selector type SEL of the given Objective-C method. Generates compiler warning if the method isn’t declared or doesn’t exist.

-(void) aMethod
{
    SEL aMethodSelector = @selector(aMethod);
    [self performSelector:aMethodSelector];
}

@encode

Returns the character string encoding of a type.

-(void) aMethod
{
    char *enc1 = @encode(int);                 // enc1 = "i"
    char *enc2 = @encode(id);                  // enc2 = "@"
    char *enc3 = @encode(@selector(aMethod));  // enc3 = ":"

    // practical example:
    CGRect rect = CGRectMake(0, 0, 100, 100);
    NSValue *= [NSValue value:&rect withObjCType:@encode(CGRect)];
}

@compatibility_alias

Allows you to define an alias name for an existing class. The first parameter is the alias for a class name, a class with this name must not exist. The second parameter is the name of an existing class that the alias refers to.

@compatibility_alias AliasClassName ExistingClassName

From then on you can use AliasClassName in place of ExistingClassName. This can be useful after refactoring a class’ name without modifying its behavior, you can use @compatibility_alias to allow existing code using the refactored class to continue to work without refactoring.

@”string”

Declares a constant NSString object. Such strings do not need to be retained or released.

-(void) aMethod
{
    NSString* str = @"This is a constant string.";
    NSUInteger strLength = [@"This is legal!" length];
}

Summary

I hope you enjoyed this list and hopefully learned something from it. If you know there’s a directive missing from the list, please add a comment and I will update the post!

分享到:
评论

相关推荐

    iphone OBJ-C入门笔记

    在 C++ 中,用 `static` 关键字声明的成员函数类似于 Objective-C 的类方法,因为它们都与类本身关联,而不是特定的实例。 7. **运行时系统** Objective-C 使用动态类型和运行时系统,允许在程序运行时决定消息的...

    Object-C语言教程0220.zip

    Objective-C(简称Obj-C或Objective-C)是苹果公司基于C语言构建的一种面向对象的编程语言,广泛应用于iOS和Mac OS X操作系统。本教程将深入探讨Object-C的基础概念、语法特性以及实际开发中的应用,旨在帮助初学者...

    C语言大学教程--c语言复习课件.ppt

    * C程序的执行步骤:编译执行程序代码的录入、生成源程序*.c、语法分析、查错、翻译生成目标程序*.obj与其它目标程序或库链接、装配、生成可执行程序*.exe * C程序的结构:C程序由一个或多个函数组成、必须有且只能...

    C语言题库172页.doc

    - 用户标识符是程序员自定义的变量名,不能与C语言的关键字相同,也不能以数字开头,选项A和D中包含了一些非法的标识符。 5. **函数和程序结构** - 函数是C程序的基本模块,由函数首部(声明参数和返回类型)和...

    (完整word版)期末复习-C语言知识点归纳(良心出品必属精品).docx

    在C语言的学习中,掌握其基础知识至关重要。以下是对C语言关键知识点的详细解析: 1. **C程序的结构**: - C程序由函数组成,其中必须包含一个`main()`函数作为程序执行的起点。 - 函数定义是平行的,不支持嵌套...

    C语言中extern用法

    问题:在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢? 答案:C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合...

    第1章-c语言学习PPT文档.pptx

    1. **简洁明了**:C语言的关键字数量有限,只有32个,这使得语言结构清晰,易于理解和学习。 2. **强大的表达能力**:尽管简洁,C语言却能有效地表达复杂的计算和逻辑操作,通过9种控制语句和丰富的运算符实现。 3. ...

    delphi使用c的obj对象文件教程

    这里,`stdcall` 是调用约定,`external` 关键字用于指定外部函数所在的 DLL 文件和函数名(如果 C 函数名在 DLL 中被导出为 mangled name,则需要提供正确的名称)。 **步骤四:编写 Delphi 代码** 现在,你可以...

    DuplicateLines:揪出万恶的重复代码

    根据 Obj-C 的关键字,去除一些重复行 删除 注释行 和 空格 删除赋值语句之前的变量 只 Print 重复次数 &gt; 3 的代码行 具体设置注释中有,可以自行设置 实际测了下,虽然目前弱爆了,但至不用在工程里人肉慢慢找了 ##...

    Object-C pdf

    Objective-C,简称Obj-C,是苹果公司为iOS和macOS平台开发应用程序的主要编程语言。它是一种动态的、面向对象的C语言扩展,结合了Smalltalk的特性,使得它在处理面向对象编程时更加灵活。这份PDF文档,针对iOS开发...

    二级C语言教程 课后习题答案(高教版).pdf

    - C语言中标识符的分类,包括关键字、用户定义标识符和预定义标识符。 6. 运算符和表达式: - 运算符的种类,如算术运算符、关系运算符和逻辑运算符。 - 表达式中赋值运算和算术运算的结合规则。 - 指定赋值和...

    C语言基础.pdf

    - 常见的C语言关键字包括int, float, double, struct, union, void等。 - 基本数据类型包括char, short, int, long, float, double等。 - 控制结构如if, for, while, do-while等。 - 函数定义和调用的语法。 3....

    Object-C 教程

    - **基于C语言**:Objective-C在C语言的基础上进行了扩展,这意味着熟悉C语言的开发者可以更快地学习Objective-C。 - **面向对象**:Objective-C支持面向对象的编程范式,包括类、对象、消息传递、继承等。 - **动态...

    c语言复习题

    - 在C语言中,编译后的目标文件通常具有`.obj`后缀。此文件包含了编译器生成的机器代码,但还没有进行链接处理。 - 正确答案是**B**。 2. **C程序中的语句结构**: - C语言中,单个语句可以由多条命令组成,这些...

    计算机专业《C语言程序设计》课程期末试卷.doc

    - C语言源代码不能直接运行,需先编译成`.obj`文件,再链接生成`.exe`可执行文件。 - 标识符命名规则中,不允许使用连接符。 - 将`int`转换为`float`使用强制类型转换`(float)n`。 - C语言的基本单位是函数。 -...

    (完整word)C语言全部章节习题集及答案.doc

    - C语言源文件的扩展名通常是`.c`,编译后目标文件扩展名为`.obj`,可执行文件扩展名为`.exe`。 - 标识符由字母、数字和下划线组成。 5. **数据类型、运算符和表达式**: - C语言提供多种数据类型,如整型(int)...

    From C++ to Objective-C

    - **nil和Nil**:nil是Objective-C中表示空对象引用的关键字,而Nil是一种特殊的空对象实例。 ##### 4.2 类声明 - **属性和方法**:在类声明中定义,使用`@property`声明属性,使用`-(返回类型)(方法名)`声明方法...

    详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量。此变量只存在于那个文件中中,不能别其他文件...因为若此时如果不分配空间,则obj中根本就不会

    Objective-C 基础教程-中文版

    它在C语言的基础上扩展了Smalltalk式的消息传递机制,成为Apple开发者工具Xcode中的主要编程语言。这篇“Objective-C 基础教程-中文版”是针对初学者和希望深入理解Objective-C的开发者设计的,旨在帮助他们掌握这一...

    计算机二级考试C语言辅导课件共三部分:第一部分.ppt

    - 源程序(`.c`)经过编译生成目标程序(`.obj`),再通过连接生成可执行程序(`.exe`)。 9. **数据类型及其运算**: - C语言的数据类型包括基本类型(如`int`、`float`)、构造类型(如数组、结构体)、指针...

Global site tag (gtag.js) - Google Analytics