OC对象的本质就是一个结构体

为什么说是个结构体?

例如:类里面声明了几个成员变量\实例变量(已添加@plublic),外部对象的指针在访问这个变量的时候是这么写的p->a


0804

注意oc的全称拼写:Objective-C

Mac终端Terminal的一些命令

  • cd 切换目录
  • touch 新建一个.m文件
  • open 打开一个.m文件
  • cc -c ...m编译.m文件,生成.o文件。不会检查方法的合法性
  • cc ...o链接.o文件,生成一个a.out程序。检测方法是否存在及其合法性。如果是c语言,则自动会把c语言的头文件搞进来,但oc的不会,需要手动导入.例如:cc ....o -framework Foundation(注意大小写). cc命令也可以直接链接.m文件。这样就是编译链接一起搞。
  • ./a.out 运行程序
  • clear 清屏
  • mkdir 创建一个文件夹
  • 如果是多个.o文件关联的话,需要在链接的时候一起链接,如果缺少oc框架还需要手动导入.例如:cc one.o two.o -framewirk Foundation

下面是具体的情况


NSLog输出的内容会自动换行

#import有两个作用
  1. 跟#include一样,拷贝文件内容
  2. 可以自动防止文件的内容被重复拷贝。例如导入同一个头文件多次,只在第一次生效,多写的那部分无效.

使用一个框架只需要将其的主头文件.h导入即可.主头文件的名称和框架的名称一样.例如:#import<Foundation/Foundation.h>

面向过程和面向对象的区别
  • 面向过程关注的是解决问题的步骤
  • 面向对象关注的是解决问题需要哪些对象

以修电脑为例:面向过程是要知道怎么修电脑,第一步干什么第二步干什么等等。而面向对象就是直接去找修电脑的人,这个人就是一个对象。面向对象不用关心这个修电脑的人怎么修的,面向过程就要知道怎么修电脑.


类和对象
  • 类是抽象的,是对对象属性和方法的概括和描述
  • 对象是具体的,对象是类的一个实例

类名和函数名第一个字母大写.方法名和变量名第一个字母小写.

函数和类
  • 完整的写一个函数:函数的声明和定义(实现)
  • 完整的写一个类:类的声明和实现

如果一个类具备创建对象的能力,则该类需要继承自NSObject

1、类的声明,用来声明对象的属性和方法

@interface Car : NSObject

{

在这中间写的是成员变量\实例变量.如果不加@public的话,外界是不能通过对象指针p->访问的.链接会报错

  • 不允许在这里初始化成员变量 (和C语言的区别)

  • 不可用static来修饰 (和C语言的区别)

  • 有的时候要把一些成员变量\实例变量直接写在打括号里面的一个原因就是,这样访问成员变量\实例变量可以直接访问,而不需要强制有个对象才能访问.写起来更方便些.但我不提倡这么写,不规范.还是用@property来声明,用self.变量来访问比较好.注意:age=10和self->age=10相同. self.age和[self age]相同. age=10才是是指成员变量本身.这个在循环强引用导致内存泄露的时候有讲法

  • 不加@public可以起到一个保护作用。不让外界的对象直接访问到该成员变量修改值,但可以通过对象方法来实现修改,比如[self setAge:0].所以尽量不要加@plublic

  • 只要在这里写成员变量一定要加下划线_ ,只要在这里加成员变量没有加下划线的就是没理解@property和成员变量的关系

}

@end

问题现象如下图:

一般都这么写:

2、类的实现

@implementation Car

#end


oc中的括号()有两个用途
  1. 用来括住数据类型
  2. 用来将int、float或者double的c语言类型的变量的值转换为oc对象的NSNumber

每个对象内部都会有一个isa指针,这个指针指向了对象所属的类.这个指针大小是8个字节。(这个isa指针实际上是NSObject的一个成员变量)而对每个类来说,每个类里面都有一个superClass指针,指向自己的父类

如下图所示:

从上图可以看出,成员变量是属于对象的,对象内存里除了isa指针就是成员变量.但方法是属于类的,对象可以共用类里面的方法

一个可能的面试题:试着从内存的角度解释一个对象是如何知道自己有哪些成员变量有哪些对象方法的

答:一个类在实例化一个对象的时候就为其在内存中分配了内存地址及内存空间。对象的内存空间里包含两部分,一个是isa指针,一个是对象的成员变量.成员变量是属于对象的,在分配内存的时候就将对象所具有的变量分配到的对象内存中.这样对象就知道了自己有哪些成员变量.而isa指针8个字节,指向了对象所属的类,方法是属于类的.通过isa指针对象就知道了自己有哪些对象方法可以执行.


方法和函数的区别
  • 方法都是以减号-或者加号+开头
  • 方法都要在@interface和#end之间,即要写在类的声明里 方的实现必须写在@implementation和@end之间。即写在类的实现里。
  • 方法只能由对象或者类来调用。函数可以脱离对象存在,但必须在类中。所以在函数中不能调用对象的成员变量。
  • 函数能写在文件中的任意位置,函数归文件所有。注意按照C语言的存放规则和调用规则。即直接调用函数名则需要把函数写在调用位置的前面。如果要写在调用位置的下面,则需要用void 函数名()的方式来调用。

iOS 基础 第一天(0804)的更多相关文章

  1. iOS基础问答面试

    <简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...

  2. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  3. iOS 基础:Frames、Bounds 和 CGGeometry

    https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...

  4. 动画 iOS基础

    动画 iOS基础 1.     basic animation  基础动画 一个基础动画 在一个开始值和一个结束值之间运动   messageLabel.alpha=0.0; [UIView  ani ...

  5. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  6. iOS 基础日记-修饰符

    今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...

  7. Xamarin iOS编写第一个应用程序创建工程

    Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...

  8. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  9. C#基础第一天-作业答案

    题一答案: Console.WriteLine("请输入a"); int a = Convert.ToInt32(Console.ReadLine()); Console.Writ ...

随机推荐

  1. Adobe Edge Animate –Edge Commons强势来袭,Edge团队开发成为现实

    Adobe Edge Animate –Edge Commons强势来袭,Edge团队开发成为现实 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. Edge ...

  2. [转]在SQL中用正则表达式替换html标签

    本文转自:http://blog.csdn.net/dhttaso/article/details/6045380 由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都 ...

  3. [改善Java代码]注意Class类的特殊性

    Java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行的,这是Java处理的基本机制,但加载到内存中的数据是 ...

  4. 关于Eclipse生成和导入Patch文件.

    & 生成的文件如下: 如果系统对这个patch文件有识别的话是一个带有问号的icon文件. diff --git a/main/plugins/org.talend.designer.core ...

  5. 关于JDK中的总结和基本知识总结

    人机交互的图形化界面(GUI) 命令行方式(CLI  command line interface) JDK有不同的版本(linux,mac os, windows) Java 的跨平台性. 软件放到 ...

  6. hdu1501 动态规划

    这题有两种解题思路,一个是记忆化搜索,一个是dp. 分别贴代码: 记忆化搜索: #include<iostream> #include<cstdio> #include< ...

  7. hdu 4604 动态规划

    思路:这题的感觉就是最长上升子序列的升级版.首先对于最长上升子序列要用n*log(n)的算法才行,这个复杂度的算法可以从hdu1025得到启发.然后就是什么情况下最优问题了.对于序列中某个数i,找出其 ...

  8. [转]Ubuntu中无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

    sudo apt-get install git E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/ ...

  9. PowerShell 解锁使用浏览器下载的文件

    1 dir *.* -Recurse | Unblock-File

  10. 解决Jquery和prototype的兼容问题

    1. 引入jquery 时,将jquery库在 prototype之前引入: 2.使用时: jQuery.noConflict();  // 这个要在 之前加上 3.初始化加载 (这里我试过,可以有两 ...