Objective-C基础语法高速入门

Objective-C是Mac软件开发领域最基本的开发语言,假如我们对C语言已经非常熟悉或者具有面向对象语言的基础。对于我们学习Objective-C将会非常实用。


方法调用(Calling Methods)
为了可以尽快上手。我们先来看一些简单的样例。

Objective-C语法里面主要的方法调用是这种:


[object method];  
 
[object methodWithInput:input];  
 
对象的方法能够返回值:


output = [object methodWithOutput];  
 
output = [object methodWithInputAndOutput:input];  
 
我们也能够在类里面调用怎样创建对象的方法。以下的这个样例里面,我们调用了NSString类的string方法:


id myObject = [NSString string];  
 
id的类型意味着myObject这个变量能够指向随意类型的变量。

当我们编译这个应用程序的时候,并不知道他实现的真实的类和方法。


在这个样例里面,非常明显这个对象的类型应该是NSString。所以我们能够改一下他的类型:


NSString* myString = [NSString string];  
 
如今myString就是一个NSString类型的变量。这个时候假如我们试图使用一个NSString没有实现的方法时,编译器就会警告我们。


一定要注意在对象类型的右边有一个星号。

全部的Objective-C对象变量都是指针类型的。

id类型已经预先被定义成一个指针类型了。

所以我们不须要再加星号。




嵌套消息调用(Nested Messages)
在很多编程语言里面嵌套消息。或者嵌套函数看起来就像这样:


function1 ( function2() );  
function2的返回值被传递给function1当输入參数。在Objective-C里面。嵌套消息调用就像这样:


[NSString stringWithFormat:[prefs format]];  
我们应该尽量避免在一行代码里面嵌套调用超过两个。

由于这种话,代码的可读性就不太好。


多參输入的方法(Multi-Input Methods)
多个输入參数的方法。

在Objective-C里面,一个方法名能够被切割成几段。

在头文件中面,就应该这样子来定义一个多输入參数的方法:


-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;  
 
我们这样来调用它:


BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO];  
 
參数不一定要给它命名。在执行期系统里面这种方法真实的名字叫writeToFile:atomically:。


Accessors(Getter & Setter)  
 
在Objective-C里面全部的实例对象默认都是私有的。

全部在大多数情况下我们须要用accessors去读取或者设置变量的值。

有两个语法都支持这种操作,这个时传统的老的语法:


[photo setCaption:@"Day at the Beach"];  
output = [photo caption];  
 
第二行的代码其实并不是直接去读对象实例的变量。

其实它调用的是名叫caption的方法。

在Objective-C里大多数情况下我们不须要给getters加get的前缀。




不管什么时候我们见到方括号,事实上我们都是向一个对象或者一个类发送了一个消息。


Dot Syntax
在Objective-C 2.0里面。新添加了一个"."操作的语法。在Mac OS X 10.5里面就使用了Objective-C 2.0语法:


photo.caption = @"Day at the Beach";  
output = photo.caption;  
 
我们两种方式都可以使用。可是在一个project里面最好保持风格一致。仅仅使用某一种。

"."操作仅仅可以被使用在setters和getters里面,而不能用在一般意思的方法上。


创建对象
主要有两种方式来创建一个对象。

第一种办法像这面这样:


NSString* myString = [NSString string];  
 
这是一种很习惯性的风格。在这样的方式情况下。我们创建的是系统自己主动释放(autoreleased)类型的对象。

关于自己主动释放类型autoreleased,我们以后会深入讨论一下。然而在很多情况下,我们须要手动的去创建对象:


NSString* myString = [[NSString alloc] init];  
 
这是一个嵌套的方法调用。第一个调用的NSString自己的alloc方法。这是一个相对照较底层的调用,由于他创建了内容,以及实例化了一个对象。


第二块代码调用了新创建对象的init方法。这个init方法实现了比較经常使用的基本设置,比方创建实例对象的參数。对于一般开发者而言,实现这个客户的类的详细的细节并不清楚。


在一些情况下,我们能够用不通的初始化方式去赋初值:


NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];  
 
主要的内存管理
假如我们正在为Mac OS X开发一个应用程序,我们能够选择是否启用垃圾回收机制。这就意味着我们不须要去考虑内存管理。除了一个特别复杂的情形我们须要处理一下。


然而,我们有的时候我们的开发环境没有垃圾回收机制。比方iPhone开发的时候就没有垃圾回收机制。

在这样的情况下,我们就须要了解一些主要的内存管理方面的概念。


假如我们手动的通过alloc创建了一个对象,我们须要用完这个对象后release它。我们不须要手动的去release一个autoreleased类型的对象,假如真的这样去做的话。我们的应用程序将会crash。


这里有两个样例:


// string1 will be released automatically  
 
NSString* string1 = [NSString string];  
 
// must release this when done  
 
NSString* string2 = [[NSString alloc] init];  
 
[string2 release];  
 
就这个教程而言,我们能够人为autoreleased对象会在当前函数方法调用完毕后被释放。


当然了,还有非常多关于内存管理的仅仅是我们须要学习。可是这须要我们了解很多其它的基本概念以后才干去涉及。




设计一个类的Interface
就Objective-C语言而言。创建一个类很easy。它很典型的分成了两个部分。


类的接口通常保存在ClassName.h文件中,它定义了实例的參数。以及一些公开的方法。


类的实如今ClassName.m文件中。它包括了真正执行的代码和那些方法。它还常常定义一些私有的方法。这些私有的方法对于子类是不可见的。


这里有一个接口文件的大概。类名Photo,所以文件名称叫Photo.h:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
@end  
 
首先,我们把Cocoa.h import进来。Cocoa的应用程序的全部的主要的类大多都是这样做的。#import宏指令会自己主动的避免把同一个文件包括多次。


@interface符号表明这是Photo类的声明。冒号指定了父类。

上面这个样例父类就是NSObject。




在大括弧里面,有两个变量:caption和photographer。两个都是NSString类型的。

当然了,他们也能够是不论什么别的类型包含id类型的。




最后@end结束整个声明。




添加方法
让我们为成员变量加一些getters:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
- caption;  
 
- photographer;  
 
@end  
 
别忘记,Objective-C方法不须要加get前缀。一个单独小横杆表明它是一个实例的方法。假如是一个加号的话,那就说明它是一个类的方法。


编译器默认的方法的返回类型为id。还有全部的方法的參数的默认类型也都是id类型的。所以上面的代码从技术上讲是对的。可是非常少这么用。我们还是给它加上返回类型吧:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
- (NSString*) caption;  
 
- (NSString*) photographer;  
 
@end  
 
以下我们再加上setters:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
- (NSString*) caption;  
 
- (NSString*) photographer;  
 
- (void) setCaption: (NSString*)input;  
 
- (void) setPhotographer: (NSString*)input;  
 
@end  
 
Setters不须要返回不论什么值。所以我们把它的类型指定为void.


类的实现
我们通过实现getters来创建一个类的实现:


#import "Photo.h"  
 
@implementation Photo  
 
- (NSString*) caption {  
 
return caption;  
 
}  
 
- (NSString*) photographer {  
 
return photographer;  
 
}  
 
@end  
 
这部分的代码由@implementation再来加上类名開始。以@end结束。就跟类的接口定义一样,全部的方法跟接口定义里的一样。

全部的对象都必要既要定义也要实现。


假如我们曾经也写过代码的话。Objective-C里面的getters看上去跟别的几乎相同。所以我们以下就来介绍setters,它须要一点说明。


- (void) setCaption: (NSString*)input  
 
{  
 
[caption autorelease];  
 
caption = [input retain];  
 
}  
 
- (void) setPhotographer: (NSString*)input  
 
{  
 
[photographer autorelease];  
 
photographer = [input retain];  
 
}  
 
每一个setter处理两个变量。第一个是当前存在对象的应用。第二个是新的输入对象。在支持垃圾回收的开发环境里,我们仅仅要直接赋新值就能够了:


- (void) setCaption: (NSString*)input {  
 
caption = input;  
 
}  
 
可是假如我们不能够用垃圾回收机制的话,我们就须要先retain旧的对象,然后retain新的对象。


有两种方法能够释放一个引用对象:release 和 autorelease。标准的release会直接删除引用。autorelease方法会在将来的某个时候去release它。

在它声明周期结束前。它会毫无疑问的存在。在本例中,上面setPhotographer中的photographer对象。将会在函数结束的时候被释放。


在setter里面用autorelease是安全的,由于新对象跟老的对象有可能是同一个对象有可能指向的是同一个对象。对于一个我们即将retain的对象。我们不应该马上release它。




这个或许如今看起来会困惑,可是随着我们的学习。会越来越能理解它。如今我们不须要立马全然理解它。


初始化
我们能够创建一个初始化方法去给类的实例的成员变量赋初值:


- (id) init  
 
{  
 
if ( self = [super init] )  
 
{  
 
[self setCaption:@"Default Caption"];  
 
[self setPhotographer:@"Default Photographer"];  
 
}  
 
return self;  
 
}  
 
上面的代码感觉没啥好解释的,尽管第二行代码好像看上去没啥用。

这个是一个单等于号,就是把[super init]的值赋给了self。




它基本上是在调用父类去实现它的初始化。这个if代码段是设置默认值之前验证初始化是否成功。


释放资源Dealloc
这个dealloc方法是在当一个对象希望被从内容里面删除的时候调用。

这个我们释放在子类里面引用成员变量的最好的时机:


- (void) dealloc  
 
{  
 
[caption release];  
 
[photographer release];  
 
[super dealloc];  
 
}  
 
開始两行我们发送了release通知给了两个成员变量。

我们不要在这里用autorelease。

用标准的release更快一点。


最后一行的[super dealloc];很重要。

我们必需要发送消息去让父类清除它自己。

假如不这么做的话,这个对象事实上没有被清除干净,存在内存泄露。


dealloc在垃圾回收机制下不会被调用到。

取而代之的是,我们须要实现finalize方法。




很多其它关于内存管理
Objective-C的内存管理系统基于引用记数。

全部我们须要关心的就是跟踪我们引用,以及在执行期内是否真的释放了内存。




用最简单的术语来解释,当我们alloc一个对象的时候。应该在某个时候retain了它。每次我们调用了alloc或者retain之后,我们都必需要调用release。


这就是引用记数理论。可是在实践的时候。仅仅有两种情况我们须要创建一个对象:


1. 成为一个类的成员变量


2. 仅仅暂时的在一个函数里面被使用


在很多其它的时候,一个成员变量的setter应该只autorelease旧的对象,然后retain新的对象。我们只须要在dealloc的时候调用release就能够了。




所以真正须要做的就是管理函数内部的local的引用。

唯一的原则就是:假如我们alloc或者copy了一个对象。那么我们在函数结束的时候须要release或者autorelease它。假如我们是通过别的方式创建的,就无论。




这里是管理成员对象的样例:


- (void) setTotalAmount: (NSNumber*)input  
 
{  
 
[totalAmount autorelease];  
 
totalAmount = [input retain];  
 
}  
 
- (void) dealloc  
 
{  
 
[totalAmount release];  
 
[super dealloc];  
 
}  
 
这里是本地引用的样例。我们仅仅须要release我们用alloc创建的对象:


NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
 
NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
 
// only release value1, not value2  
 
[value1 release];  
 
这里是用本地引用对象去设一个成员变量的样例:


NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
 
[self setTotal:value1];  
 
NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
 
[self setTotal:value2];  
 
[value1 release];  
 
注意到怎样管理本地引用事实上都是一样的。无论你是否把它设给了一个成员变量。

我们无须考虑setters的内部实现。


假设我们非常好的理解了这些的话,我们基本上理解了80%的Objective-C内存管理方面的内容了。




属性Properties
前面我们写caption和author的accessors的时候。你能够已经注意到了代码很简明,应该能够被抽象提取出来。


属性在Objective-C里是一个新的功能。他能够让我们自己主动的生成accessors,另外另一些别的长处。我们能够把上面Photo的类转成用属性来实现:


上面那个类原先的实现是这样:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
- (NSString*) caption;  
 
- (NSString*) photographer;  
 
- (void) setCaption: (NSString*)input;  
 
- (void) setPhotographer: (NSString*)input;  
 
@end  
 
假如用属性来实现就是这样:


#import  
 
@interface Photo : NSObject {  
 
NSString* caption;  
 
NSString* photographer;  
 
}  
 
@property (retain) NSString* caption;  
 
@property (retain) NSString* photographer;  
 
@end  
 
@property是Objective-C来声明属性的编译指令。括号中面的"retain"指明了setter须要retain输入的对象。这行其它的部分指定了属性的类型以及名字。


以下让我们来看看这个类的实现:


#import "Photo.h"  
 
@implementation Photo  
 
@synthesize caption;  
 
@synthesize photographer;  
 
- (void) dealloc  
 
{  
 
[caption release];  
 
[photographer release];  
 
[super dealloc];  
 
}  
 
@end  
 
@synthesize指令自己主动的生成了我们的setters和getters。

所以我们仅仅须要实现类的dealloc方法。


Accessors仅仅有当他们原先没有的时候,才会被生成。所以能够放心大胆的去用@synthesize来指定属性。并且能够任意实现你自己的getter和setter。编译器会自己去找哪个方法没有。


属性声明还有别的选项。可是限于篇幅层次,我们下次再介绍。




Logging


在Objective-C里。往console写日记很easy。其实NSLog()跟C语言的printf()两个函数差点儿全然同样。除了NSLog是用额外的“%@”去获得对象。


NSLog ( @"The current date and time is: %@", [NSDate date] );  
 
我们能够log一个对象到console里去。NSLog函数调用要输出对象的description方法。然后打印返回的NSString。我们能够在自己的类里重写description方法。这样我们就能够得到一个自己定义的字符串。




调用nil对象的方法(Calling Methods on Nil)
在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的差别就是nil是一个对象,而NULL仅仅是一个值。并且我们对于nil调用方法,不会产生crash或者抛出异常。


这个技术被framework通过多种不同的方式使用。最基本的就是我们如今在调用方法之前根本无须去检查这个对象是否是nil。

假如我们调了nil对象的一个有返回值的方法,那么我们会得到一个nil返回值。


我们能够通过nil对象让我们的dealloc函数实现看上去更好一些:


- (void) dealloc  
{  
self.caption = nil;  
self.photographer = nil;  
[super dealloc];  
}  
 
之所以能够这么做是由于我们给把nil对象设给了一个成员变量。setter就会retain nil对象(当然了这个时候nil对象啥事情也不会做)然后release旧的对象。

这个方式来释放对象事实上更好,由于这样做的话,成员变量连指向随机数据的机会都没有,而通过别的方式,出现指向随机数据的情形机会不可避免。


注意到我们调用的self.VAR这种语法,这表示我们正在用setter,并且不会引起不论什么内存问题。

假如我们直接去设值的话,就会有内存溢出:


// incorrect. causes a memory leak.  
// use self.caption to go through setter  
caption = nil;  
 
Categories
Categories是Objective-C里面最经常使用到的功能之中的一个。 基本上category能够让我们给已经存在的类添加方法,而不须要添加一个子类。并且不须要知道它内部详细的实现。




假设我们想添加某个framework自带的类的方法,这很有效。假设我们想在我们程序project的NSString可以添加一个方法,我们就行使用category。甚至都不须要自己实现一个NSString的子类。




比方,我们想在NSString里面添加一个方法来推断它是否是一个URL。那我们就能够这么做:


#import  
 
@interface NSString (Utilities)  
 
- (BOOL) isURL;  
 
@end  
 
这跟类的定义很类似。差别就是category没有父类。并且在括号中面要有category的名字。名字能够随便取,可是习惯叫法会让人比較明确category里面有些什么功能的方法。


这里是详细的实现。可是要注意,这本身并非一个推断URL非常好的实现。我们主要是为了总体的了解category的概念。


#import "NSString-Utilities.h"  
 
@implementation NSString (Utilities)  
 
- (BOOL) isURL  
 
{  
 
if ( [self hasPrefix:@"http://"] )  
 
return YES;  
 
else  
 
return NO;  
 
}  
 
@end  
 
如今我们能够在不论什么的NSString类对象里都能够调用这种方法了。以下的代码在console里面打印的"string1 is a URL":


NSString* string1 = @"http://www.CocoaDev.cn/";  
 
NSString* string2 = @"Pixar";  
 
if ( [string1 isURL] )  
 
NSLog (@"string1 is a URL");  
 
if ( [string2 isURL] )  
 
NSLog (@"string2 is a URL");  
 
跟子类不一样。category不能添加成员变量。

我们还能够用category来重写类原先的存在的方法,可是这须要很很小心。


记住,当我们通过category来改动一个类的时候,它相应用程序里的这个类全部对象都起作用。


后记
上面Objective-C的比較基础的大概的讲了一下。Objective-C还是比較好上手的。没有特别的语法须要去学习。并且一些概念在Objective-C里面被重复运用。

转载于:https://www.cnblogs.com/zsychanpin/p/7128343.html

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

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

相关文章

华为堡垒机_运维堡垒机----Gateone

简介:运维堡垒机的理念起源于跳板机。2000年左右,高端行业用户为了对运维人员的远程登录进行集中管理,会在机房里部署跳板机。跳板机就是一台服务器,维护人员在维护过程中,首先要统一登录到这台服务器上,然…

拼图推迟将Java 9的发布日期推迟到2017年

由于Jigsaw项目的延迟,Java 9的发布日期被推迟到2017年 由于项目延迟的悠久历史,这可能不足为奇,但是看起来备受期待的拼图项目已被延迟。 再次。 好消息是,与上一次使用Java 8不同,它仍在Java 9的开发路线上。坏消息…

前端获取当前url路径

前端获取当前url路径//获取url路径 function getUrlPath(){//获取当前网址var currentPath window.document.location.href;//获取主机地址之后的目录var pathName window.document.location.pathname;var pos currentPath.indexOf(pathName);//获取主机地址var localhostPa…

jquery改变字符串中部分字符的颜色

//该方法改变字符串中中括号内&#xff08;包括中括号&#xff09;的字符串颜色为红色function changecolocer() {  var zf $(#YWFA).text();   if(zf.length>0){     $(#YWFA).html(zf.replace(/\【.*?\】/g,<label style"color:red;">$&<…

java自动推断类型_Java 7的类型推断

java自动推断类型每个优秀的程序员都喜欢编写简洁但有效且经过优化的代码。 类型推断是JDK 7中引入的一种方法&#xff0c;它肯定会为您带来更少键入的好处。 您以以下方式使用Java代码已有很长时间了。 但是&#xff0c;在初始化Collections的特定实现时&#xff0c;您是否曾经…

shell 删除七日内日志_shell日志删除(超容量自动)

背景&#xff1a;避免双十一磁盘被打爆&#xff0c;本想通过crontab执行&#xff0c;但是删除需要密码&#xff0c;所以用作当机器磁盘高于摸个阈值&#xff0c;进行无关性日志强删#!/bin/sh#use#sh clean.sh wmporder_prehost 38(说明&#xff1a;磁盘超过38%&#xff0c;则进…

form表单序列化转换为json对象

form表单序列化转换为json对象//form表单序列化转换为json对象 (function($){$.fn.serializeJsonfunction(){var serializeObj{};var arraythis.serializeArray();$(array).each(function(){if(serializeObj[this.name]){if($.isArray(serializeObj[this.name])){serializeObj[…

拓扑排序 确定比赛名次

确定比赛名次Problem Description有N个比赛队&#xff08;1<N<500&#xff09;&#xff0c;编号依次为1&#xff0c;2&#xff0c;3&#xff0c;。。。。&#xff0c;N进行比赛&#xff0c;比赛结束后&#xff0c;裁判委员会要将所有参赛队伍从前往后依次排名&#xff0c…

JavaFX技巧22:“自动调整大小(树)”表列

JavaFX “缺少功能调查”中提到的“缺少功能”的第一件事就是能够自动调整表/树表中的列大小。 没错&#xff0c;没有公共API是正确的&#xff0c;但是当您密切关注时&#xff0c;您会注意到JavaFX内部一定有执行此操作的代码&#xff0c;因为用户可以通过双击分隔线自动调整列…

aesmiyao php_PHP使用AES,ECB模式块和PKCS5Padding生成对称密钥

首先,要对你需要即兴创作的输入做PKCS#5填充&#xff1a;// source: http://php.net/manual/en/ref.mcrypt.php#69782function pkcs5_pad($text, $blocksize){$pad $blocksize - (strlen($text) % $blocksize);return $text . str_repeat(chr($pad), $pad);}然后选择你的算法并…

解决复合主键

解决复合主键使用IdClass(BzdmKey.class)注解 package entity.po;import javax.persistence.*;/*** Package main.java.pojo* Description BZDM对象的pojo类* Author zhaohuaqing*/ Entity Table(name "ts_bzdm") IdClass(BzdmKey.class) public class Bzdm {/*** …

【数据挖掘导论】——数据质量

数据质量数据挖掘使用的数据一般是为其它用途收集或者收集的时候还没有明白目的。因此数据经常不能在数据的源头控制质量。为了避免数据质量的问题&#xff0c;所以数据挖掘着眼于两个方面&#xff1a;数据质量问题的检測和纠正&#xff08;数据清理&#xff09;&#xff1b;使…

rocksdb原理_[转]Rocksdb Compaction原理

概述compaction主要包括两类&#xff1a;将内存中imutable 转储到磁盘上sst的过程称之为flush或者minor compaction&#xff1b;磁盘上的sst文件从低层向高层转储的过程称之为compaction或者是major compaction。对于myrocks来说&#xff0c;compaction过程都由后台线程触发&am…

P2216 [HAOI2007]理想的正方形(二维RMQ)

题目描述 有一个a*b的整数组成的矩阵&#xff0c;现请你从中找出一个n*n的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 输入输出格式 输入格式&#xff1a; 第一行为3个整数&#xff0c;分别表示a,b,n的值 第二行至第a1行每行为b个非负整数&#xff0…

MD5加密

MD5加密package common.util;import java.math.BigInteger; import java.security.MessageDigest;/*** Package main.java.utils* Description 加密* Author zhaohuaqing*/ public class MD5 {public static final String KEY_MD5 "MD5";/*** param inputStr 输入的…

jrockit_JRockit JRCMD教程

jrockit本文将为您提供概述和教程&#xff0c;说明如何使用jrcmd工具对JRockit Java Heap问题进行初始分析和问题隔离。 将来的文章中将介绍使用JRockit任务控制和堆转储分析&#xff08;仅JRockit R28 版&#xff09;的更深入的分析和教程。 有关JRockit Java堆空间的快速概述…

jQuery 事件 - ready() 方法

jQuery 事件 - ready() 方法当 DOM&#xff08;文档对象模型&#xff09; 已经加载&#xff0c;并且页面&#xff08;包括图像&#xff09;已经完全呈现时&#xff0c;会发生 ready 事件。 1.语法1 $(document).ready(function)2.语法2 $().ready(function)3.语法3 $(funct…

axios vue 加载效果动画_vue中使用axios拦截器实现数据加载之前的loading动画显示 @劉䔳...

首先新建一个 loading.vue组件&#xff0c;写loading动画效果.loader {width: 100%;height: 100%;display: flex;align-items: center;justify-content: center}-webkit-keyframes loading{50% {transform: scale(.4);opacity: .3}100% {transform: scale(1);opacity: 1}}.load…

Spark学习笔记(7)---Spark SQL学习笔记

Spark SQL学习笔记 Spark SQL学习笔记设计到很多代码操作&#xff0c;所以就放在github, https://github.com/yangtong123/RoadOfStudySpark/blob/master/src/com/spark/sql/Readme.md其中包括了对Spark2.0的新特性的介绍&#xff0c;包括SparkSession, DataSet等转载于:https:…

性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程

问题背景 有一台linux服务器测试环境cpu经常到达80%,造成系统卡顿,部分功能不可用. 分析步骤 1.使用perf制作cpu火焰图 通过制作cpu火焰图,发现很多进程都存在大量的clock_gettime系统调用. 2. 使用bcc工具funclatency`进一步查看clock_gettime的调用次数 # /usr/share/bc…