object-c 入门基础篇

  一、Objective-C与C的渊源 

      Objective-C诞生于 20 世纪 80 年代,由Brad Cox 发明,意在将流行的、可移植的 C 语言与优雅的 Smalltalk 语言结合在一起。Objective-C 是 C 语言的一个扩展集,它以 C 语言为基础,在语言中添加了一些微妙但意义重大的特性。 

      苹果公司的iphone平台采用Objective-C做为native language的开发,Objective-C的内核是C语言的,并基于C语言实现OOP的一些特性。Objective-C是对C语言的扩展,这和C++的前身Better-c有很大的相似之处,Objective-C的新版本里实现了和Java类似的垃圾回收机制,但基于iphone平台的资源限制,iphone平台并不支持垃圾回收机制。 

二、初识Objective-C 

      1、Cocoa的组成 

      苹果公司将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架集提供Cocoa组成部分有:(1)Foundation框架(有很多有用的,面向数据的低级类和数据结构);(2)Application Kit(也称AppKit)框架(包含了所有的用户接口对象和高级类,例如NS……),还有一个支持框架的套件,包括Core Animation和Core Image。 

     2、NSLog相当于printf() 

     NSLog(@"hello Objective-C"); 

    //注:@是Objective-C在标准C语言基础上添加的特征之一,双引号的字符串前面有一个@,这表示引用的字符串应该作为Cocoa的NSString元素处理 

    NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent)); 

    //注意%@:使用NSLog输出任何对象值时,都会使用这个格式说明 

    3、BOOL使用8位存储,YES定义为1,NO定义为0,大于1不为YES,跟标准C不同。 

    若不小心将一个长于1字节的整型值赋给BOOL,则只截取低八位 

    Obejective-C中1不等于1,绝对不要将BOOL值和YES比较 



三、怪异的Objective-C语法结构 

   我这里之所以说它的怪异,是相对于习惯其它编程语言(JAVA,C++等语言),下面把它最常见的特色简单说明: 

   1、减号(或者加号) 

   我们每天都会在IOS开发中见到在方法名前“+”或“─”号,那么这些是什么,怎么这么奇怪? 

首先要把以前学习面向对象语言的惯性思维抛去,在Objective-C里面没有public和private的概念,你可以认为全是public;它只有类方法和实例方法,加号表示类方法,类方法可以直接调用,而不用创建这个类的实例;减号表示实例方法,需要创建这个类的实例对象才可以调用。 


比如c#/java中,一个方法的写法可能是: 

private void hello(bool ishello) 



//OOXX 





用Objective-C写出来就是 

-(void) hello:(BOOL)ishello 



//OOXX 



    有过编程经验的人,理解这些应该不难! 
    2、中括号 

    中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。 

比如C#里你可以这么写: 

this.hello(true); 

在Objective-C里,就要写成: 

[self hello:YES]; 

   3、NS**** 

   在IOS开发中,经常会遇到NS开头的对象,这个要从乔帮主历史恩怨说起。当年Steve Jobs 和John Scullery与恩怨,乔帮主当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。 

   这些开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名,也就是NS****了。比较常见的比如: 

NSLog 

NSString 

NSInteger 

NSURL 

NSImage 

… 

   你会经常看到一些教学里面会用到: 

NSLog (@"%d",myInt); 

   这句话主要是在console里面跟踪使用,你会在console里面看到myInt的值(在XCode里面运行的时候打开dbg窗口即可看到)。 

你还可以看到其他名字打头的一些类,比如CF、CA、CG、UI等等,比如 

CFStringTokenizer 这是个分词的东东 

CALayer 这表示Core Animation的层 

CGPoint 这表示一个点 

UIImage 这表示iPhone里面的图片 

CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface……还有很多别的,等你自己去发掘了。 

四、Objective-C常见语法说明 

   1 头文件引用使用 #import “文件名”或者 #import <文件名>的形式以确保每个头文件仅被包含一次; 

   2 类声明以 @interface 类名:继承类 开头,以 @end 结尾,类实现以@implementation 类名 开头,以 @end 结尾; 

   3 实例方法,即成员方法,在方法名前面添加一个减号(-);类方法,在方法名前面添加一个加号(+); 

   4 类方法的调用格式为 [类名 类方法],成员方法调用格式为 [实例名 实例方 法],这种模式在ObjC中被称为消息机制,[对象 消息]即给对象发送了一个消息,产生的 效果就是该对象调用了该类中定义的对应的实例方法; 

   5 下面以一个简单的例子来说明上述语法: 

Print类.h文件(声明文件) 

#import <Foundation/Found
@interface Print : NSObject { //Objective-c的所有类都继承于NSObject 

    // 成员属性 

    NSString *caption; 

    NSString *photographer; 



//在Objective-C 2.0引入了属性合成,相当于之前的get/set方法 

@property (nonatomic, copy) NSString *caption; 

@property (nonatomic, copy) NSString *photographer; 



// 类方法 

+ (NSString*)printName; 

@end 

Print类.m文件(实现文件) 

#import "Print.h" 

@implementation Print 

@synthesize photographer; 

@synthesize caption; 


// 类方法 

+ (NSString*)printName 



    return (@"Print Result"); 





@end 


Print 类使用 

#import "Print.h" 



int main(int argc, const char *argv[]) 



    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    return NSApplicationMain(argc, (const char **)argv); 

    // 类方法调用 

    NSLog(@"ClassName = /"%@/"", [Print printName]); 



    // 初始化 

    Print* p = [[Print alloc] init]; 

    // 设置器调用 

    [p setCaption:@"MyCaption"]; 

    [p setPhotographer:@"MyPhotographer"]; 



    // 获取器调用 

    NSLog(@"Caption = /"%@/"", [p caption]); 

    NSLog(@"Photographer = /"%@/"", [p photographer]); 

    [pool drain]; 



    return 0; 



运行这段代码,结果如下: 
2011-05-31 11:12:13.715 demo[1471:903] ClassName = "Print Result" 

2011-05-31 11:12:13.718 demo[1471:903] Caption = "MyCaption" 

2011-05-31 11:12:13.718 demo[1471:903] Photographer = "MyPhotographer

 

转载:http://www.cnblogs.com/moonvan/archive/2011/10/13/2210498.html

转载于:https://www.cnblogs.com/Sumnus/p/3406160.html

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

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

相关文章

GeneralUpdate实现应用程序更新

微软中国MSDN 点击上方蓝字关注我们大家好&#xff0c;我是本期的实验室研究员——朱震。今天我将通过实验和完整的操作过程&#xff0c;向大家介绍如何基于开源项目GeneralUpdate打造一个能自动升级的客户端应用。接下来就让我们一起到实验室中一探究竟吧&#xff01;微软MVP…

看完数学概念背后的故事,让孩子的数学兴趣激增1000倍!

▲ 点击查看英国著名科学家霍金在撰写《时间简史》的时候&#xff0c;出版商郑重其事地建议道&#xff1a;“你的书里多一条数学公式&#xff0c;就会失去一部分读者。”可见对数理化的害怕&#xff0c;也没有国界&#xff0c;大家都一样。看着满满都是概念和数字的课本&#x…

栈和队列之生成窗口最大值数组

package com.chenyu.zuo.stackAndQueue;import java.util.LinkedList;/*** 题目:有一个整形数组,arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。* 例如数组[4,3,5,4,3,3,6,7],窗口的大小为3时;* [4 3 5] 4 3 3 6 7 窗口中最大值为5* 4[ 3…

主存和cache每一块相等_笔记:cpu中的cache(一)

前言&#xff1a;绝大部分内容来源于北京大学的慕课《计算机组成原理》&#xff0c;地址&#xff1a;https://www.coursera.org/learn/jisuanji-zucheng存储体系&#xff08;《深入理解计算机系统》&#xff09;cache是为了解决cpu和内存速度不对等的问题。一&#xff0c;cache…

MATLAB中求矩阵非零元的坐标

MATLAB中求矩阵非零元的坐标&#xff1a; 方法1&#xff1a; indexfind(a); [i,j]ind2sub(size(a),index); disp([i,j])方法2&#xff1a; [i,j]find(a>0|a<0) %列出所有非零元的坐标 [i,j]find(ak) %找出等于k值的矩阵元素的坐标所用函数简介&#xff1a; IND2SUB Mult…

设计模式学习笔记(十七)——Command命令模式

设计模式学习笔记&#xff08;十七&#xff09;——Command命令模式 Command命令模式介绍&#xff1a; Command命令模式是一种对象行为型模式&#xff0c;它主要解决的问题是&#xff1a;在软件构建过程中&#xff0c;“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问…

MAUI中Maui.Graphics.Controls绘制控件

简介Microsoft.Maui.Graphics是一个完全采用C#的iOS&#xff0c;Android&#xff0c;Windows&#xff0c;macOS&#xff0c;Tizen和Linux的跨平台图形库。对于MAUI项目当中绘制的方案是使用不同平台的控件来而非自绘。当然MAUI当中也使用了Microsoft.Maui.Graphics,MAUI Previe…

BGP聚合as-set advertise-map

advertise-map xxx 用来挂汇总路由的&#xff0c;当route-map xxx 中的路由存在时&#xff0c;才会出现汇总路由。否则没有汇总路由只继承advertise-map xxx 中路由的属性当汇总路由携带了多个明细属性&#xff0c;可用advertise-map xxx 来移除某个明细路由的路由属性实验拓扑…

Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出

先爆照: 问题: 使用过popupWindow的时候,我们为了让其它地方不可点击,我们一般会pw.setFocusable(true),但是当我们这样设置之后,问题出现了,按返回键或者menu菜单键没有反应,这是原因呢? PopupWindow 跟我们的 Activity 不一样,因为我们在构造 PW 的时候往往不是继…

上班骚扰男同事被抓到......

1 不同年代的辞职理由&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 月壤不能种菜太让人失望了▼3 原来&#xff0c;我也努力过▼4 忘了上班还有监控&#xff08;作者来源最右&#xff0c;ID&#xff1a;8943090 &#xff09;▼5 这是台风被黑的最惨的一次&…

mysql8 修改权限_MySQL8修改重置root密码,远程连接权限设置

MySQL8 修改重置root密码这里要单独强调是MySQL8&#xff0c;因为在MySQL 8.04前&#xff0c;执行&#xff1a;SET PASSWORDPASSWORD([新密码]);可行&#xff0c;但是MySQL8.0.4开始&#xff0c;这样默认是不行的。因为之前&#xff0c;MySQL的密码认证插件是“mysql_native_pa…

.NET 6新特性试用 | DateOnly和TimeOnly类型

前言在.NET 6之前&#xff0c;没有方法来直接表示没有时间的日期&#xff08;比如生日&#xff09;或者没有日期的一天中的时间&#xff08;比如闹钟&#xff09;。虽然我们可以使用DateTime类和TimeSpan类来代替&#xff0c;但是实际使用中会存在一些问题&#xff1a;var date…

用wordpress制作网站的总结

在没有自己的网站的时候很像拥有一个属于自己的网站&#xff0c;可以说是自己的一个愿望吧。但是当我真正的运行起来了之后觉得没有多么的兴奋&#xff0c;自己也折腾了几天wordpress,从买域名空间&#xff0c;到安装WP&#xff0c;遇到了一些问题&#xff0c;自己到处搜索答案…

解析super-smack的smack文件

Super-smack是一款强大的数据库压测工具&#xff0c;现在支持mysql和PostgreSQL两种数据库&#xff0c;你可以通过简单的配置文件(.smack)来生成一系列测试环境&#xff1a;测试数据&#xff0c;测试表&#xff1b;在测试的过程中&#xff0c;你可以控制客户端的并发数量以及执…

JSP是不是Java发展史上的一大败笔?

JSP一个年代传奇人物&#xff0c;它的诞生成果了网络的三国鼎立的局势&#xff0c;可是&#xff0c;几年的结构的风烟席卷&#xff0c;让JSP逐渐淡出这个前史舞台&#xff0c;有人不由宣布这样的感叹&#xff0c;JSP是不是Java开展史上的一大败笔呢&#xff1f; 查询样本 让咱们…

Android之使用PopupWindow使用和总结

不废话,先爆照 说明: 那个灰色背景是不能滑动里ListView里面的内容的 第一步:我们需要背景view 下面是我的background.xml文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/t…

Cell发文!施一公科研团队取得重大突破

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;科学网&#xff08;有删减&#xff09;北京时间2020年12月29日凌晨0时&#xff0c;《细胞》&#xff08;Cell&#xff09;发表中科院院士、西湖大学校长施一公课题组的一项新研究。研究首次报道了γ-分泌酶&#xff…

MAUI 跨平台播客应用程序(Conf 2021)

介绍在.NET Conf 2021大会上&#xff0c;微软展示了基于.NET6 跨平台应用程序, 具有ASP.NET Core、Blazor、.NET MAUI、微服务等功能。浏览由 ASP.NET Core 和 Blazor 提供支持的 .NET Podcasts 应用的实时运行版本&#xff1a;https://dotnetpodcasts.azurewebsites.net/项目体…

mysql enum_MySQL数据库中关于ENUM类型的详细解释

MySQL数据库中&#xff0c;因为工作的需求&#xff0c;我们可能会用到ENUM类型&#xff0c;但是由于此类型不是很常用&#xff0c;我们可能对其也不是很了解。没关系&#xff0c;本文我们就对ENUM类型做一些详细的解释&#xff0c;希望能够对您有所帮助。ENUM类型是一个字符串对…

Linux系统新手学习的11点建议

随着Linux应用的扩展许多朋友开始接触Linux&#xff0c;根据学习Windwos的经验往往有一些茫然的感觉&#xff1a;不知从何处开始学起。这里介绍学习Linux的一些建议。 一、从基础开始&#xff1a;常常有些朋友在Linux论坛问一些问题&#xff0c;不过&#xff0c;其中大多数的问…