iOS 基础 第一天(0804)
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有两个作用
- 跟#include一样,拷贝文件内容
- 可以自动防止文件的内容被重复拷贝。例如导入同一个头文件多次,只在第一次生效,多写的那部分无效.
使用一个框架只需要将其的主头文件.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中的括号()有两个用途
- 用来括住数据类型
- 用来将int、float或者double的c语言类型的变量的值转换为oc对象的NSNumber
每个对象内部都会有一个isa指针,这个指针指向了对象所属的类.这个指针大小是8个字节。(这个isa指针实际上是NSObject的一个成员变量)而对每个类来说,每个类里面都有一个superClass指针,指向自己的父类
如下图所示:



从上图可以看出,成员变量是属于对象的,对象内存里除了isa指针就是成员变量.但方法是属于类的,对象可以共用类里面的方法
一个可能的面试题:试着从内存的角度解释一个对象是如何知道自己有哪些成员变量有哪些对象方法的
答:一个类在实例化一个对象的时候就为其在内存中分配了内存地址及内存空间。对象的内存空间里包含两部分,一个是isa指针,一个是对象的成员变量.成员变量是属于对象的,在分配内存的时候就将对象所具有的变量分配到的对象内存中.这样对象就知道了自己有哪些成员变量.而isa指针8个字节,指向了对象所属的类,方法是属于类的.通过isa指针对象就知道了自己有哪些对象方法可以执行.
方法和函数的区别
- 方法都是以减号-或者加号+开头
- 方法都要在@interface和#end之间,即要写在类的声明里 方的实现必须写在@implementation和@end之间。即写在类的实现里。
- 方法只能由对象或者类来调用。函数可以脱离对象存在,但必须在类中。所以在函数中不能调用对象的成员变量。
- 函数能写在文件中的任意位置,函数归文件所有。注意按照C语言的存放规则和调用规则。即直接调用函数名则需要把函数写在调用位置的前面。如果要写在调用位置的下面,则需要用void 函数名()的方式来调用。
iOS 基础 第一天(0804)的更多相关文章
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- iOS 基础:Frames、Bounds 和 CGGeometry
https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...
- 动画 iOS基础
动画 iOS基础 1. basic animation 基础动画 一个基础动画 在一个开始值和一个结束值之间运动 messageLabel.alpha=0.0; [UIView ani ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- iOS 基础日记-修饰符
今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...
- Xamarin iOS编写第一个应用程序创建工程
Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- C#基础第一天-作业答案
题一答案: Console.WriteLine("请输入a"); int a = Convert.ToInt32(Console.ReadLine()); Console.Writ ...
随机推荐
- [改善Java代码]在switch的default代码块中增加AssertionError错误
switch的后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句似乎没有任何作用了,程序已经列举出了所有的可能选项,肯定不会执行到default语句,. 错 ...
- [BigData]关于HDFS的伪分布式安装和虚拟机网络的配置
[BigData]关于Hadoop学习笔记第一天(段海涛老师)(三) 视频2: hadoop的应用在电商,"浏览了该商品的人还看了","浏览了该商品的人最终购买的&quo ...
- Redis--分布式锁
在高并发的使用场景下,如何让redis里的数据尽量保持一致,可以采用分布式锁.以分布式锁的方式来保证对临界资源的互斥读写. redis使用缓存作为分布式锁,性能非常强劲,在一些不错的硬件上,redis ...
- hdu 4628 动态规划
思路:首先就是状态压缩,然后判断哪些状态是回文串.最后就是动态方程:dp[i]=min(dp[i],dp[j]+1).这个方程得前提条件是状态(j-i)为回文串. #include<iostre ...
- CXF(2.7.10) - RESTful Services
1. 定义 JavaBean.注意 @XmlRootElement 注解,作用是将 JavaBean 映射成 XML 元素. package com.huey.demo.bean; import ja ...
- plsqldev与sqldeveloper
plsqldev连接 1.连接不同服务器,要修改tnsnames.ora文件,具体如下修改如下位置 # tnsnames.ora Network Configuration File: \app\us ...
- ckrule规则编辑器在wpf中的使用
当前,ckrule的IDE和业务管理系统都是由winform开发的,规则编辑器也只提供了winform的版本,所以很多的朋友都提出意见,要有wpf的版本.wpf的界面设置和管理都更加的方便. 事实上可 ...
- 记redis的一个测试
现有020的系统架构走库存,取券通过Fetch前n条来实现买n张优惠券,但此做法在高并发时有严重的性能问题,性能问题主要体现在数据库. 为了优化此性能,系统改为redis,走队列模式,即生产者消费者. ...
- 在 Java 中将 Unicode 编码的汉字转码
今天在做一个新浪微博的抓取测试,发现抓取后的内容是Unicode编码的,完全找不到熟悉的汉字了,下面搜索出来的一种方法,完全可行,只是不知到Java内部是否提供了相关的类库. 实现方法如下: publ ...
- IOS中一个简单的粒子效果实现
1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒 ...