Object C语法学习笔记(一)
1.@property与@synthesize配对使用。
@property预编译指令的作用是自动声明属性的setter和getter方法。
@synthesize 创建了该属性的访问代码
功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
2.强引用(__strong)和 弱引用(__weak)
在Objective-C的ARC模式中,
id obj1 = [[NSObject alloc] init];
这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即:
id obj1 = [[NSObject alloc] init];
和
id __strong obj1 = [[NSObject alloc] init];
是等价的。
在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。
强引用持有对象,弱引用不持有对象。
强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱引用会自动的指向nil。
下面用代码来说明:
//
// main.m
// ARC中的强引用和弱引用
// #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) {
@autoreleasepool {
id __weak obj0 = nil;
if (YES) {
id obj1 = [[NSObject alloc] init];
obj0 = obj1;
NSLog(@"obj0: %@", obj0);
}
NSLog(@"obj0: %@", obj0);
}
return 0;
} /*
* 输出结果
* obj0: <NSObject: 0x1003066c0>
* obj0: (null)
*
* 因为obj1生成的默认的为强引用(__strong),在超出if的作用域之后,obj1所持有的对象被释放,
* obj0为弱引用,所以obj0不持有对象,在obj1对象释放后,obj0自动的被赋值为nil
* 弱引用的特性是,不持有对象,即便是写成id __weak obj1 = [[NSObject alloc] init];
* 此代码系统会给与警告,因为这里obj1被声明成弱引用,那么在赋值之后,alloc出来的对象会被立即释放。
*/
3.点表达式,可以用来访问对象,类似C语言的结构体访问。
点表达式出现在等号的左边,该变量名称的setter方法将被调用;点表达式出现在等号的右边,该变量名称的getter方法将被调用。
4.什么是Category
Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择。新添加的方法同样也会被被扩展的类的所有子类自动继承。当知道已有类中某个方法有BUG,但是这个类是以库的形式存在的,我们无法直接修改源代码的时候,Category也可以用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。然而却没有什么便捷的途径可以去调用已有类中原有的那个被替换掉方法实体了。需要注意的是,当准备有Category来替换某一个方法的时候,一定要保证实现原来方法的所有功能,否则这种替代就是没有意义而且会引起新的BUG。和子类不同的是,Category不能用于向被扩展类添加实例变量。Category通常作为一种组织框架代码的工具来使用。
Category的用途
1. 在不创建继承类的情况下实现对已有类的扩展。
2. 简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。
3. 将常用的相关的方法分组。
4. 在没有源代码的情况下可以用来修复BUG。
Category的用法
在Obj-C中,声明某一个已有类的Category扩展的方法如下:
@interface ClassName (CategoryName)
-methodName1
-methodName2
@end
上面的声明通常是在.h文件中,然后我们在.m文件中实现这些方法:
@implementation ClassName (CategoryName)
-methodName1
-methodName2
@end
我们创建一个iOS Single View Applciation名为CategoryExample。然后为创建一个NSString类的category扩展。File->New->File然后选择 Cocoa Touch Objective-C category.命名为ReverseNSString.系统会自动生成一个固定格式ClassName+CategoryName的.h和.m文件。
声明Category
打开NSString+ReverseNSString.h文件,在里面添加如下代码:
#import <Foundation/Foundation.h>
@interface NSString (ReverseNSString)
+ (NSString*) reverseString:(NSString*)strSrc;
@end
实现Category
NSString+ReverseNSString.m文件中实现reverseString方法:
#import"NSString+ReverseNSString.h"
@implementationNSString (ReverseNSString)
+ (NSString*)reverseString:(NSString*)strSrc;
{
NSMutableString *reversedString =[[NSMutableString alloc]init];
NSInteger charIndex = [strSrc length];
while (charIndex > 0) {
charIndex--;
NSRange subStrRange =NSMakeRange(charIndex, 1);
[reversedString appendString:[strSrcsubstringWithRange:subStrRange]];
}
return reversedString;
}
@end
剩下的工作就是验证我们的Category了,在view中添加一个按钮ReverseString,并设置相应的action方法为reverseString.在view上再添加一个label,命名为myString,默认值是”HelloCategory Design Pattern!”。点击按钮反转这个字符串。主要代码如下:
-(IBAction)reverseString:(id)sender {
NSString *test = [NSStringreverseString:_myString.text];
_myString.text = test;
}
代码组织
Category用于大型类有效分解。通常一个大型类的方法可以根据某种逻辑或是相关性分解为不同的组,一个类的代码量越大,将这个类分解到不同的文件中就显得越有用,每个文件中分别是这个类的某些相关方法的集合。
当有多个开发者共同完成一个项目时,每个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,因为开发人员之间的工作冲突更少了。
Category VS添加子类
并没有什么界限分明的判定标准来作为何时用Category何时用添加子类的方法的指导。但是有以下几个指导性的建议:
- 如果需要添加一个新的变量,则需添加子类。
- 如果只是添加一个新的方法,用Category是比较好的选择。
5.Class Extension(类扩展)
class extensions用于解决两个问题:
- 允许一个对象可以拥有一个私有的interface,且可由编译器验证。
- 支持一个公有只读,私有可写的属性。
若要定义私有函数,通常是在实现文件中声明一个"Private" category:
@interface MyClass (Private)
- (id)awesomePrivateMethod;
@end
然而, 类的私用方法通常是希望实现在类的@implementation块中的,而不是像上面的Category的方法那样实现在独立的@implementation区块中。事实上,Category仅仅是弥补了Objective-C缺少public/private限定的不足。
真正的问题是Objective-C编译器会认为在Category中声明的方法将会在别处实现,所以编译器并不会尝试确认它们是不是真得都被实现了。也就是说,开发者声明的方法有可能并未实现,而且编译器也不会有什么警告。编译会以为它们将在别的地方或独立的文件中实现。
使用class exteionsion,在其中声明的方法和属性的实现将放在class的@implementation区块中。否则,编译器就会报错。
// someClass.m
@interface someClass ()
-(void)extend;
@end @implementation someClass
// 所有声明在头文件或父类中方法的实现
// 或者一些私有函数
-(void)extend {
// implement private method here;
} @end
公有可读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)
实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter修改对象的状态。然而,可能又希望它在内部又是一个可写的属性。Class extensions可以做到这一点:在公共接口(类的声明中)中,开发者可以声明一个属性是只读的,随后在类扩展中声明为可写。这样,对外部代码而言,该属性将是只读的,而内部代码却可以使用它setter方法。
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end // 私有的extension, 隐藏在主实现文件中.
@interface MyClass ()
@property (retain, readwrite) float value;
@end
6.判断对象类型
对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。
-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
7.尖括号的含义
声明语句后面的尖括号内的内容标识遵守的协议的名称,如果协议有多个,则在尖括号内部以逗号分隔列出来。
8.self和self class指针的区别
self是实例的指针,[self class]是类的指针,静态方法得用类的指针来调用
9.@optional和@required
如果指定的关键字@required,则该方法是必须实现的,如果指定了@optional,该方法不是必须实现。
10.
Object C语法学习笔记(一)的更多相关文章
- Object C语法学习笔记(二)
1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...
- 毕业设计 之 五 PHP语法学习笔记
毕业设计 之 四 PHP语法学习笔记 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 说明:该笔记是对网站编程语言的详细学习 一.PHP基础 0. 关于环境 ...
- Golang 语法学习笔记
Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...
- MarkDown语法 学习笔记 效果源码对照
MarkDown基本语法学习笔记 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 下面将对Markdown的基本使用做一个介绍 目 ...
- doy05循环语法学习笔记
doy05循环语法学习笔记 一.while循环语法: 1.基本用法示例 x = 1 while x <= 5: print(x) x += 1 2.死循环:永远不结束的循环 如:while Tr ...
- mySql 基本语法学习笔记
create database if not exists yang; drop database if exists yang; show databases; show dat ...
- Object C语法学习
#synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量 . @implementation 关键字,表明类的实现 @en ...
- Mustache.js语法学习笔记
原文地址:http://www.cnblogs.com/flypig88/archive/2012/05/14/2497780.html 看了Mustache的github,学学其中的语法,做个笔记 ...
- Scala基本语法学习笔记
Scala语法与JAVA有很多相似的地方,两者也可以相互调用.但是整体感觉Scala语法等简洁.灵活.这里记录下Scala有特点的地方,以备以后查找方便. 参考: 使用 import: htt ...
随机推荐
- POJ2817 WordStack(状压DP)
题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数. 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个 ...
- BZOJ1707 : [Usaco2007 Nov]tanning分配防晒霜
S向每头奶牛连边,容量1 每个防晒霜向T连边,容量cover 每头奶牛向SPF在自己范围内的防晒霜连边,容量inf 用线段树优化建图跑最大流即可. #include<cstdio> con ...
- codevs 1507酒厂选址
#include<cstdio> #include<cstdlib> using namespace std; int n; int dis[10010],a[10010],x ...
- 响应式HTML5+CSS3 网站开发测试实践
仅仅利用media query适配样式是远远不够的,并没有考虑触屏下的行为和特有的内容组织方式的不同.简单在桌面版基础上叠加mobile版的代码,会带来请求增多.流量.性能.代码冗余等诸多方面问题.有 ...
- 【壁纸自动换】自动下载、更换壁纸(Bing壁纸)--XinBSBingWallPaper[2.7更新]
XinBSBingWallPaper主要功能: 1.支持自动下载Bing壁纸.Netbian壁纸.美国国家地理杂志图片. 2.自动搜索.下载多国Bing首页壁纸. 3.支持定时自动更换桌面壁纸. 4. ...
- C#泛类型链表的实现
使用泛型LinkedList<T>类.下面的方法创建了一个LinkedList<T>类,并往链表对象中添加节点,然后使用了几种方法从链表节点中获得信息. publi ...
- POJ 3440 Coin Toss(概率)
题目链接 概率问题,像是概率论上学的均匀分布,是不是呢,忘了... 概率同面积有关系,我写的各种搓,然后此题格式十分变态,=前有的时候俩空格,有的时候一个空格.代码各种搓. #include < ...
- Jquery_JQuery之DataTables强大的表格解决方案
1.DataTables的默认配置 $(document).ready(function() { $(‘#example’).dataTable(); } ); 示例:http://www.guoxk ...
- [转] - linux下socket编程实例
一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...
- .NET Framework 4.5 的五大特性
介绍 从.NET4.5发布到现在已经有一年多了.但问题是针对最近微软发布的版本信息中,大部分的.NET开发人员所讨论交流的只是其中的一两个特性.其他的特性仅仅停留在MSDN中或者沦为简介文档.例如:现 ...