iOS开发——项目实战总结&带你看看Objective-C的精髓
带你看看Objective-C的精髓
1:接口与实现
@interface
...@end
@implementation
...@end
@class
接口(头文件)
实现文件
向前引用
注:类别通过增加新的类和实例方法来扩展现有类的行为。作为惯例,类别被定义在它们自己的.{h,m}
文件里,
2:实例变量可视性
@public
@package
@protected
@private
@public
:实例变量可使用符号 person->age = 32"
被直接读取。
@package
:实例变量是公开的,除非它被指定在框架外(仅适用64位架构)
@protected
:实例变量仅可由其类和其衍生类访问
@private
:实例变量仅可由其类访问
3:属性
@property
@synthesize
@dynamic
关于属性值得注意的一点是,从 Xcode 4.4 开始,我们再也不需要明确的合成属性了。在 @interface
中被声明的属性在 implementation 中被自动的合成(与前面有下划线的ivar名称一起,比如@synthesize propertyName = _propertyName
)。
@dynamic 是相对于 @synthesize 的,它们用样用于修饰 @property,用于生成对应的的 getter 和 setter 方法。但是 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。
4:协议
@protocol
@required
@optional
定义了一组将在服从该协议的类中实现的方法,就好像它们被加入到那个类的接口中一样。
你可以通过指定方法为必须和可选来更深入的定制一个协议。可选的方法在接口上存根,以便能被 Xcode 自动完成但如果方法没有被实现又不生成警告。协议方法默认是必须的
5:异常处理
@try
@catch
@finally
@throw
Objective-C 主要通过 NSError
来沟通意想不到的异常状态。而其他语言使用异常处理,Objective-C 则将异常以及程序员错误降级为真正的异常的行为。
6:对象常量
@""
@42
,@3.14
,@YES
,@'Z'
@[]
@{}
@()
@""
:返回一个由引号内Unicode内容初始化的 NSString
对象。
@42
,@3.14
,@YES
,@'Z'
:返回一个由相关类构造初始化的 NSNumber
对象,比如 @42
→[NSNumber numberWithInteger:42]
,或者 @YES
→ [NSNumber numberWithBool:YES]
。支持使用后缀进一步指定类型,如 @42U
→ [NSNumber numberWithUnsignedInt:42U]
。
@[]
:返回一个由冒号分隔的对象列表作为内容的 NSArray
对象。比如,@[@"A", @NO, @2.718]
→ [NSArray arrayWithObjects:@"A", @NO, @2.718, nil]
(注意在数组常量中结束标记nil
是不需要的)。
@{}
:返回一个由特定键-值对初始化作为内容的NSDictionary
对象,格式:@{@"someKey" : @"theValue"}
。
@()
:动态评估封装的表达,并返回基于其值的合适的对象常量(比如,const char*
返回NSString
,int
返回NSNumber
,等等。)。这也是使用数字常量和枚举
值的指定方式。
7:Objective-C 常量
@selector()
@protocol()
@selector()
:返回一个指向有特定名称的选择器的 SEL
指针。用于类似 -performSelector:withObject:
的方法。
@protocol()
:返回一个指向有特定名称的协议的 Protocol *
指针。用于类似 -conformsToProtocol:
的方法。
8:C 常量
@encode()
@defs()
@encode()
:返回一个类型的类型编码。这个类型值可以用于 NSCoder -encodeValueOfObjCType:at
中的第一个参数编码。
@defs()
:返回一个 Objective-C 类的布局。比如,定义一个与 NSObject
有相同布局的 struct,你只需要这样:
9:优化
@autoreleasepool{}
@synchronized{}
@autoreleasepool{}
:如果你的代码中包含创建大量临时对象的紧密的循环,你可以通过 @autorelease
更加积极的释放这些寿命短暂,局部范围内的对象来达到优化。@autoreleasepool
替换并且改进了旧的又慢又不能在ARC中使用的NSAutoreleasePool
。
@synchronized(){}
:这个指令为在一特定的环境中(通常是 self
)确保安全执行某一特定块提供了一个便捷的方法。这种情况的死锁很昂贵,所以,对于针对特定级别的线程安全的类来说,建议使用专用的 NSLock
属性或者使用如OSAtomicCompareAndSwap32(3)
的底层的死锁函数。
10:兼容
@compatibility_alias
允许现有类有不同的名称作为别名。
iOS开发——项目实战总结&带你看看Objective-C的精髓的更多相关文章
- iOS开发项目实战——Swift实现图片轮播与浏览
近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...
- iOS开发项目实战——Swift实现ScrollView滚动栏功能
手机作为一个小屏设备,须要显示的信息往往无法在一个屏幕上显示,此时就须要使用到滚动栏,当然除了像TableView这样能够自带滚动功能的. 假设一个界面上View较多,那就必须要使用到ScrollVi ...
- iOS开发——项目实战总结&经典错误一
经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s ...
- IOS开发-项目实战-点赞功能的实现
实现思路: 1.每一条新闻就是一个cell,在cell上添加点赞按钮. 2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去. 3.并将这条新闻的ID和当前用户的 ...
- iOS开发——项目实战总结&Block使用注意点浅析
Block使用注意点浅析 1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock ...
- iOS开发——项目实战总结&关于随机量
关于随机量 rand 是一个标准的 C 函数. random 是定义为 POSIX 标准的一部分. arc4random 是在 BSD 和派生平台. 随机数 arc4random_uniform(N) ...
- iOS开发——项目实战总结&数据持久化分析
数据持久化分析 plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 当存储大块数据时你会怎么做? 你有很多选择,比 ...
- iOS开发——项目实战OC篇&类QQ黏性按钮(封装)
类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...
- C# Xamarin移动开发项目实战篇
一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发 ...
随机推荐
- hdu 4647 - Another Graph Game(思路题)
摘自题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. 代码如下: #include ...
- java知识点--重写与重载
重载(Overload): (1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. ...
- 【转载】php中iconv函数使用方法
原文:http://www.phpweblog.net/star65225692/archive/2011/03/23/7524.html 在选择用什么工具开发,唯一的指导标准就是:用最少的人 ...
- Memcached分布式缓存初体验
1 Memcached简介/下载/安装 Memcached是一个高性能的不是内存对象缓存系统,用于动态Web应用以减轻数据库负载.Memcached基于一个存储键/值对的HashMap.其客户端可以使 ...
- ThreadLocal线程范围内的共享变量
模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread; import java.util.Has ...
- 关于解决keil4和mdk共存后51不能使用go to definition Of 'XXXXXX'问题
自己安装keil4和mdk共存后,(我是先安装的keil 后安装的 MDK),在51单片机工程里不能使用go to definition Of 'XXXXXX'问题, 类似的如图 已经困扰了好长时间, ...
- duilib进阶教程 -- 响应windows原生消息和自定义消息(13)
一.windows原生消息 同样,入门教程只是给出了响应windows原生消息的方法,并没给出例子,这里以自适应屏幕分辨率为例.迅雷播放器虽然可以在启动的时候自动调整窗口大小,但是当屏幕分辨率实时改变 ...
- iOS-常用的辅助工具软件
1.Navicat Premium11.0.20破解版快速安装配置(附文件) Navicat Premium是当下非常好用的数据库管理软件,但是价格非常昂贵,并且还有某些小bug,感觉3000+的 ...
- iOS-项目打包为ipa文件
最近自己做的一个项目,由于app store发布流程比较复杂,且审核周期较长,客户希望提前能看到产品,所以我先给自己的项目打包成一个ipa文件(类似Android的apk安装包),然后发布在" ...
- muduo库的简单使用-echo服务的编写
muduo库的简单使用 muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写. 它的使用方法很简单,参考这篇文章:TCP网络编程本质论 里面有这么几句: 我认为,TCP 网络编程最 ...