Objective-C 学习笔记

超类

即父类,通过 [super setName: @"a"] 可以调用超类方法

复合

是指一个对象由其他多个对象组成

对象初始化

@interface Car : NSObject
(Engine *engine;
)
@end@implementation Car
- (id) init
{
  //因init方法可能返回不同的对象,所以需要更新self。如从很长的字符串生成新字符串,初始化函数可能创建属于其他类的对象,类似NSCFArray问题。实例变量的内存位置到隐藏self参数之间的距离是固定的,所以得保证init返回的对象,在后面引用能够正确映射内存位置。
if(self = [super init]){ engine = [Engine new];}return (self); } //init @end

若要超类可以完成所需的一次性初始化,需要调用[super init]。将[super init]的结果赋给self是oc的标准惯例。防止超类在初始化过程中返回的对象不同于原先创建的对象。

 Car *car = [[Car alloc] init]  alloc先分配内存空间,并且内存初始化为0,指针为nil;init初始化对象。

new 和 alloc init可以说等价,但一般不用

#import

1、导入系统头文件用 <>,导入项目本地头文件用 ""

2、a.m 的implementation 时需要 #import "a.h" 

3、@interface中, a.m 可以使用 @class Engine 来告诉编译器以后会知道这是个什么,implementation中还是需要#import。#import会告诉编译器类的详细信息,而@class只会告知这是一个类。#import循环依赖引用会报错,而@class不会, A引用B,B引用A。不可以在子类里使用@class引用超类,因为那时候编译器还不知道超类的信息。

 

内存管理

alloc、new、copy都会使引用计数+1

Mango *mango = [Mango new];  //count1
[mango retain];  //count 2
[mango release]; //count 1
[mango release];  // dealloc   count1
//dealloc 后引用计数不一定是0,因为虽然对象已经销毁,但是实际内存里的数据并没有删除

 

访问器

@property @synthesize  编译器自动生成get、set方法,不用成对出现

@synthesize (readwrite/readonly copy/retain) NSString *name;

1、readwrite 可读写,默认

2、readonly 只读,只可调用get方法

3、copy 复制对象

4、retain 保留和释放操作

5、copy/retain不指定则 赋值操作

 

类别

类别类似C#的扩展方法,方法可以不实现,编译器不会抱错,所以调用之前最好先检查是否已实现。

@interface NSString (NumberConvenience类别名)- (NSNumber *) lengthAsNumber类别方法;@end@implementation NSString (NumberConvenience)- (NSNumber *) lengthAsNumber{unsigned int length = [self length];return ([NSNumber numberWithUnsignedInt: length]);}@end

调用 NSNumber *length = [@"abc" lengthAsNumber];

 

类扩展

 为一个类添加额外的原来没有的变量、方法或者合成属性。

@interface MyClass () { //类扩展    float value;    
}    
- (void)setValue:(float)newValue;    
@end   

 类别与类扩展的区别:

①类别中只能增加方法;

②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认是@private类型的(作用范围只能在自身类,而不是子类或其他地方);

③类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。

④类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。

⑤定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

协议

1、非正式协议其实是NSObject(子类)的一个类别,可选实现

选择器@selector(方法) 和 obj respondToSelector:@Selector(方法) 能检测对象是否支持此方法

2、正式协议 @protocol 

  协议要求采用者必须实现列出的方法,不引入实例变量。2.0之前必须全部实现,2.0加入了 @required  @optional 可选和必选

@protocol NSCopying  //由cocoa声明-(id) copyWithZone: (NSZone *) zone;@end@interface Engine : NSObject<NSCopying>//instance variables@end@implementation Engine
-(id) copyWithZone: (NSZone *)zone
{//[self class] 保证调用对象不管是父类还是子类都可以被复制不出错Engine *engineCopy = [[[self class] allocWithZone: zone] init];return engineCopy;
}
@end@interface Tire : NSObject<NSCopying>
{float pressure;float treadDepth;  
}
//...methods
@end
实现
-(id) copyWithZone: (NSZone *) zone
{Tire *tireCopy = [[[self class] allocWithZone:zone]initWithPressure: pressuretreadDepth: treadDepth];return tireCopy;
}
Tire的子类AllWeatherRadial不需要<NSCopying>,因为继承了父类的NSCopying
@interface AllWeatherRadial : Tire
{float rainHandling;float snowHandling;
}
//... methods
@end
实现
-(id) copyWithZone: (NSZone *) zone
{//子类只需调用父类已实现的copy方法来复制自身,父类使用的self class保证复制的是自己AllWeatherRadial *tireCopy = [super copyWithZone: zone];[tireCopy setRainHandling: rainHandling];[tireCopy setSnowHandling: snowHandling];return tireCopy;
}

 -(void) setObjectValue: (id<NSCopying>) obj;   id<协议> 表示可以使用任意数据类型赋值,只要它实现了NSCopying协议

 

KVC 键值编码

-valueForKey:   -setValue:forKey:

如:NSNumber *number = [tire valueForKey:@"pressure"];

     [tire setValue: [NSNumber numberWithFloat: 12.0] forKey:@"pressure"];

kvc还可以使用路径调用

  NSNumber *level = [member valueForKey:@"memberExten.level"];

kvc可以进行一些计算返回

      NSNumber *count = [member valueForKey:@"invests.@count"];   计算invest数组的数量

  NSNumber *count = [member valueForKey:@"invests.@sum.amount"]; 计算投资总金额

  NSNumber *count = [member valueForKey:@"invests.@max.amount"]; 计算最大投资额

  NSNumber *count = [member valueForKey:@"invests.@avg.amount"]; 计算平均投资额

  NSArray *loans = [member valueForKey:"@invests.distinctUnionOfObjects.loanId"]; 去重取出所有投标Id

  NSDictionary *memberValues = [member dictionaryWithValuesForKeys: [NSArray arrayWithObjects: @"RegName", @"RealName", @"MobilePhone", nil]];  取出三个字段的值

  NSDictionary *values = [member dictionaryWithValuesForKeys: [NSArray arrayWithObjects:@"RegName", @"RealName", nil]];    取出值

      NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:

                             @"Mango", @"RegName", [NSNumber numberWithInt:22], @"Age", nil];

      [member setValuesForKeysWithDictionary: dic];   设置值

如果对象没有对应的key,会放弃操作,并引发-setValue:forUndefinedKey:方法,可以重写此方法做一些相应处理,比如存储一个NSMutableDictionary,获取方法为-valueForUndefinedKey:

如果为NSDictionary/NSMutableDictionary setObject:forKey: 设置nil,会警告

如果为NSMutableDictionary setValue:forKey: 设置nil,会删除这个key

 

转载于:https://www.cnblogs.com/mango03/p/4336228.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】使用命令行方式创建和启动android模拟器

原文网址&#xff1a;http://blog.csdn.net/tiandinilv/article/details/8953001 1、Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的移动设备。Android的模拟器是基于QEMU开发的&#xff0c;QEMU是一个有名的开源虚拟机项目&#xff08;详见http://bellard.org/qem…

centos7限制cpu使用_Linux系统进程CPU使用率限制脚本

一、背景近日在客户系统运维中发现&#xff0c;有系统在定时脚本执行期间会将Linux系统CPU利用率跑满&#xff0c;导致其他服务受到影响&#xff0c;故查阅资料发现有大神写的CPU利用率限制程序。地址&#xff1a;CPU Usage Limiter for Linux根据此编写脚本&#xff0c;配合定…

LPC1768的SPI通讯

SPI是一种全双工串行接口&#xff0c;可处理多个连接到指定总线上的主机和从机。在数据传输过程中总线上只能有一个主机和一个从机通信。在数据传输中&#xff0c;主机总是会向从机发送一帧8到16个位的数据&#xff0c;而从机也总会向主机发送一帧字节数据 使用代码如下 void S…

python 项目实战视频_腾讯视频 Python 爬虫项目实战

做了一些小项目&#xff0c;用的技术和技巧会比较散比较杂&#xff0c;写一个小品文记录一下&#xff0c;帮助熟悉。需求&#xff1a;经常在腾讯视频上看电影&#xff0c;在影片库里有一个"豆瓣好评"板块。我一般会在这个条目下面挑电影。但是电影很多&#xff0c;又…

Java中文乱码问题(转)

解决JSP中文乱码问题 大家在JSP的开发过程中&#xff0c;经常出现中文乱码的问题&#xff0c;可能一至困扰着大家&#xff0c;现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先了解一下Java中文问题的由来&#xff1a; Java的内核和class文件是基于unicode的…

文本显示变量_几千个IO状态显示.十几分钟搞定实例

工程上常会在一个或者数个界面中对所有IO点监控&#xff0c;很多小伙伴用一一映射的传统方法来实现&#xff0c;在超小型项目中实用性较强&#xff0c;在稍微大一点的项目中实现起来效率低还经常出错。本文旨在分享有价值的实际经验&#xff0c;供小伙伴们参考。在实现监控前要…

贷款购房 房贷 每月还款额是如何计算出来的? 每月还款额计算步骤/方法

http://jingyan.baidu.com/m/article/0eb457e55f23fc03f1a905e5.html购房和贷款是每个普通百姓都关心的事情。贷款购房最基本的问题当然是琢磨贷款、还贷以及还贷年限与自己每月的那点“杯水车薪”收入之间的关系&#xff0c;怎样让它们门当户对起来&#xff0c;如何对着一张载…

wordl流程图怎么写字_DLG的制作流程图

1)影像自适应预处理及几何成像模型参数计算 对原始影像进行增强处理。 根据卫星影像的各种资料构建其几何成像模型。2)像控点及加密点量测 像控点的像方量测。将外业提供的控制点进行量测&#xff0c;点位的量测精度应尽量达到子像素级。 在卫星影像重叠和覆盖范围内量测一定数…

TabBarController创建及使用方法简介

TabBarController创建及使用方法简介 大致讲解一下TabBarController的创建过程&#xff1a; 首先&#xff0c;我们需要一些视图&#xff0c;如创建UIControllerView类型的view1&#xff0c;view2&#xff0c;view3. 然后&#xff0c;我们需要创建 一个UITabBarController类型的…

python操作sqlite3 导入csv文件_[转载]SQLite 3导入导出成txt或csv操作

平时使用官方提供的sqlite3.exe工具来操作 sqlite的数据库,可以在网上下到。进入管理&#xff1a;sqlite3.exe d:\\test.db //假设数据是 d:\\test.db>.databases //显示所有数据库 和 mysql的 showdatabases;>.tables //显示当前数据库的表格 和 mysql 的show tables…

android人脸识别的背景图_Android 图片人脸识别剪切

场景在开发中我们经常需要对图片以人脸为中心进行剪切并显示&#xff0c;这时就需要下面这个工具了。实现效果实现效果项目参考及引用项目使用将下载的jar 和 .so 文件加入到项目中。API 说明在项目中使用如下API即可&#xff1a;CImageView这是一个继承ImageView的图片控件&am…

华为gre隧道全部跑静态路由

最终实现&#xff1a; 1、pc1能用nat上网ping能pc3 2、pc1能通过gre访问pc2 3、全部用静态路由做&#xff0c;没有用ospf&#xff0c;如果要用ospf&#xff0c;那么两边除了路由器上跑ospf&#xff0c;核心交换机也得用ospf r2配置&#xff1a; acl number 3000 rule 5 deny…

数组与串,串的实现,KMP,BF算法

数组是一种常用的数据结构&#xff0c;高级语言头提供了支持数组的基本操作&#xff0c;而且数组也是构成其他数据结构的重要组成。 数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列。 数组的任一个元素都可以用在数组的位置来表示。 数组与线性表区别&#xf…

libsvm python_LibSVM for Python 使用

经历手写SVM的惨烈教训(还是太年轻)之后&#xff0c;我决定使用工具箱/第三方库PythonLibSVM是开源的SVM实现&#xff0c;支持C&#xff0c; C&#xff0c; Java&#xff0c;Python &#xff0c; R 和 Matlab 等, 这里选择使用Python版本。安装LibSVM将LibSVM仓库的所有内容放入…

结对开发——求最大值

一、题目&#xff1a; 返回一个整数数组中最大子数组的和。 要求&#xff1a; 1.输入一个整形数组&#xff0c;数组里有正数也有负数。 2.数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。 3.求所有子数组的和的最大值。要求时间复杂度为O(n)。 二…

浏览器获取设备信息_一条命令获取 IE 浏览器保存网站的账号和密码信息

渗透攻击红队一个专注于红队攻击的公众号大家好&#xff0c;这里是 渗透攻击红队 的第 41 篇文章&#xff0c;本公众号会记录一些我学习红队攻击的复现笔记(由浅到深)&#xff0c;不出意外每天一更Powershell内网渗透一直以来都是一个热门话题&#xff0c;试想在一个大型的内网…

__bridge,__bridge_retained,__bridge_transfer

最近遇到类型转换需要添加__bridge等开始不是很理解&#xff0c;后面查询资料才知道在CFObject 与 NSObject 之间转换时&#xff0c;ARC是不能管理Core Foundation object的生命周期。 在CFObject 与 NSObject 之间转换时&#xff0c;需要用到__bridge,__bridge_retained,__bri…

thinkphp5 判断数据是否存在_ThinkPHP 5.1 中间件中判断要访问的操作是否存在

ThinkPHP 5.1 中间件中判断要访问的操作是否存在ifu25 • 2021 年 01 月 15 日按惯例还是吐槽 ThinkPHP 官方社区极度不友好&#xff0c;提问基本得不到答案&#xff0c;更很少有官方人员回复。ThinPHP 5.1 中间件判断 action 是否存在中间件public function handle($request, …

NodeJS 学习记录

一、环境 1. 操作系统&#xff1a;win7, 32位 2. nodejs版本&#xff1a;v0.12.0 3. npm版本&#xff1a;2.5.1 二、问题 1. npm安装镜像源问题 国外镜像源很慢&#xff0c;国内出名且公开的有淘宝&#xff0c;也有内部未公开的&#xff0c;比如我所在的公司 示例&#xff1a; …

(转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

转发&#xff1a;微软MVP 卢建晖 的文章&#xff0c;希望对大家有帮助。原文&#xff1a;http://blog.csdn.net/kinfey/article/details/44459625 编者语 &#xff1a; 昨晚写好的文章居然csdn不审核&#xff0c;这个也难怪人&#xff0c;但自己比较忙没办法。分享继续&#xf…