今天做项目时编写了一个类,在类方法里调用实例方法(静态方法)时,我用 self 去调用,结果出错,但是实例化一个对象,用此对象去调用实例方法时就没有问题。查资料才知道:
iOS编程——类方法 和self
Objective-C里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。
注意点一:类方法
1,类方法可以调用类方法。
2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。
注意点二:self的规则
大家需要记住下面的规则:
1,实例方法里面的self,是对象的首地址。
2,类方法里面的self,是Class.
尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。
以上是今天学习到的第一个内容,接前一天所提到的 xcode 菜单里 Product -->Analyze 的使用,此工具不能在设备为模拟器的时候起作用,必须要选择 IOS devise 才会起作用。这一工具对解决潜在的内存泄漏问题有很大的帮助。
项目上,在步行路线请求返回数据时,添加了错误处理机制。
下午编写堆排序代码,堆排序的基本思想就是,先对待排数据进行建堆处理,将所有的数据组成一个“大顶堆”,然后由于是大顶堆,所以最大元素必定在堆顶,也就是处于第一个位置,将第一个元素和最后一个元素进行交换,则原排序数据个数减1,剩下的数据除了堆顶不满足“大顶堆”定义外,其他结点都符合“大顶堆”定义,只需对根结点进行处理,得到新的大顶堆,重复这一过程继续对其它数据排序。具体的可以参考以下代码:
<pre name="code" class="objc"><span style="color:#3366ff;">// 堆排序
// 返回左孩子位置
int left(int index){
return 2*(index+1)-1; // 适应下标为0的需求
}
// 返回右孩子位置
int right(int index){
return 2*(index+1); // 适应下标为0的需求
}
/*!
函数功能:将以指标 index 为根的子树建成最大堆
参数说明:
a[] 待排数组
index 指标数,以index为根
heapSize 堆的大小,也就是数组 a 所能容纳的最大下标
算法时间复杂度: O(lgn)
*/
void MaxHeapify(int a[],int index,int heapSize)
{
if ( (a == NULL)||(index<0)||(index >= heapSize) ) {
return;
}
int leftIndex = left(index);
int rightIndex = right(index);
int largestIndex = -1;
if ((leftIndex <= heapSize) && (a[index] < a[leftIndex]))
{
largestIndex = leftIndex;
}
else
largestIndex = index;
if ((rightIndex <= heapSize) && (a[largestIndex] < a[rightIndex]))
{
largestIndex = rightIndex;
}
if (largestIndex != index) {
int temp = a[index];
a[index] = a[largestIndex];
a[largestIndex] = temp;
MaxHeapify(a, largestIndex, heapSize);
}
}
/*!
函数功能:
将待排数组按顺序建立一个大顶堆
从最后一个非叶子结点(也就是最后一个叶子节点的父节点)开始
注意到,下标从0开始,故而最后一个非叶子节点也不是 length/2 的向下取整了
参数说明:
a[] 待排数组
length 待排数组元素个数
算法时间复杂度: 线性时间内完成
*/
void CreateMaxHeap(int a[],int length)
{
for (int i = (length/2 -1) ; i >= 0; i--)
{
MaxHeapify(a, i, length-1);
}
}
/*!
堆排序主体程序,将数组按升序排列
算法思想:
通过函数 CreateMaxHeap 将待排数组建立起大顶堆,所以最大元素处于堆顶.
只需将堆顶元素和最后一个元素互换,则待排数组 a[0..n] 变成 a[0..n-1],
但是,新的根元素不满足大顶堆要求(其余结点都满足),只需调用方法MaxHeapify(a, 0, heapSize);
即可完成对新的根元素建立新的大顶堆,每次让 heapSize 减 1(最后一个元素完成排序,被析出)
重复以上过程即可完成排序.
函数名:
“堆排序”
函数功能:
对给定数组用堆排序方法按升序排列
参数说明:
a[] 待排数组
length 待排数组元素个数
算法时间复杂度: O(nlgn)
*/
void HeapSort(int a[], int length)
{
int heapSize = length - 1;
CreateMaxHeap(a, length);
for (int i = length-1; i > 0; i--)
{
int temp = a[0];
a[0] = a[i];
a[i] = temp;
heapSize = heapSize - 1;
MaxHeapify(a, 0, heapSize);
}
}</span>
main 函数里只需调用 HeapSort 函数即可