1. 程式人生 > >objective-c 類和物件中靜態資料成員和靜態成員函式(類方法)詳解

objective-c 類和物件中靜態資料成員和靜態成員函式(類方法)詳解

作為初學者,相信大家都對objective-c的靜態資料成員和靜態成員函式都挺糾結的,我現在和大家分享下我對這個知識點的理解,請大家多多指點....

如果大家學過C++,那麼都應該知道和了解靜態資料成員和靜態成員函式是怎麼宣告和使用的;現在就讓我來說說objective-c和C++在靜態成員在使用和宣告上的異同點吧。

        首先來說說宣告:

A:靜態資料成員的宣告

C++是如下宣告的:

class  Human{
public:
    int volume();
private:
    static  int  height;
}

objective-c 的宣告和C++的宣告有很大不一樣。你不能在

@interface裡宣告,只能在它的外面宣告,但是,如果你在.h裡面宣告的話,你將得到兩個靜態資料成員,一個是類的靜態資料成員,一個是全域性的靜態資料成員。相信大家對這個都不太理解,好的,那我先上程式碼:

先上類Human.h的程式碼:

//
//  Human.h
//  @[email protected]
//
//  Created by b126 on 12-4-12.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
static int ludehai;
@interface Human : NSObject
{
    //int age;
    //int ludehai;
    float height;
    int ear;
    float eyes;
    NSString *leftHand;
    NSString *rightHand;
}
/*這裡用@property表示,代表了age和height的set,get方法的宣告
 這相當於
 @property(readwrite) int age;
 @property(readwrite) float height;
*/
@property int age;/*這裡相當於作如下宣告:
                   - (int)age;  
                   -(void)setAge:(int)newAge;  */
@property float height;//同上


//這裡用@property表示,代表了ear的get方法的宣告
@property(readonly) int ear;/*這裡相當於作如下宣告:
                             - (int)ear;
                             */

//assign: 預設型別,setter方法直接賦值,而不進行retain操作
@property(assign) float eyes;

//
@property(copy) NSString *leftHand;


@property(retain) NSString *rightHand;
+(void) test;
+(void)setLudehai:(int)c;
+(int)getLudehai;

@end

在上Human.ml的程式碼
//
//  Human.m
//  @[email protected]
//
//  Created by b126 on 12-4-12.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "Human.h"

@implementation Human

//這裡用@synthesize表示age,height變數的set,get方法的實現。
@synthesize age;
                /*相當於這樣實現方法
                 - (int)age  
                 {  
                 return age;  
                 }  
                 -(void)setAge:(int)newAge 
                 {  
                 age = newAge;  
                 }*/
/*如何這樣寫,那麼age返回值就會是輸入的兩倍
 -(int)age{
 return age * 2;
 }*/
@synthesize height;//同上


//這裡@synthesize表示ear變數的get方法的實現
@synthesize ear;/* 相當於這樣實現程式碼
                 - (int)ear
                 */

@synthesize eyes;

@synthesize leftHand;

@synthesize rightHand;




//重寫init方法給age賦初值
-(id)init
{
    if(self=[super init])
    {
        ear=20;
    }
    return self;
}

+(void) test{
    NSLog(@"test+");
}
+(void)setLudehai:(int)c{
    ludehai = c;
}
+(int)getLudehai{
    return ludehai;
}
@end

最後,當然,不能少了main.m的程式碼:
//
//  main.m
//  @[email protected]
//
//  Created by b126 on 12-4-12.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Human.h"

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

    @autoreleasepool {
        
        // insert code here...
        [Human test];
        ludehai = 50;
        [Human setLudehai:100];
        NSLog(@"%i",[Human getLudehai]);
        NSLog(@"%i",ludehai); 
    }
    return 0;
}

好的,最後的輸出結果是:

2012-05-03 17:03:10.850 @[email protected][1186:403] test+
2012-05-03 17:03:10.853 @[email protected][1186:403] 100
2012-05-03 17:03:10.853 @[email protected][1186:403] 50

相信大家看到輸出結果的時候肯定想自己去試試。

其實,當我看到輸出結果的時候也挺驚訝,我的理解如下:在Human.h裡宣告:

static int ludehai;

當你在main.m裡將Human.h包含進來的時候,objective-c就給ludehai這個變數分配了兩個記憶體空間,一個是類Human的,一個全域性的Human,這樣我們可以給他們賦予兩個不同的值。

好了,那我們該在那裡宣告類的靜態資料成員呢?

經過我的測試,我覺得我們應該把類的靜態資料成員宣告在Human.m裡面:

#import "Human.h"

@implementation Human
static int ludehai;
這樣,objective-c就給ludehai這個變數分配一個空間了,在main.m裡不能直接呼叫到了,就只能通過靜態成員函式呼叫和賦值

B:靜態成員函式

               C++的靜態成員函式是這樣宣告的:

     static int volume();

objective-c的靜態成員函式也叫類方法,是這樣宣告的:

+(void) test;
+(void)setLudehai:(int)c;
+(int)getLudehai;
對,在objective-c裡,“+”宣告的函式是靜態成員函式(類方法)。“-”宣告的叫例項方法。他們兩者的區別是:“+”的要通過類名呼叫,“-”必須是物件呼叫。

相關推薦

C++之函式物件/偽函式Function Object

       除了自定義的函式物件,標準庫還為我們提供了一系列現成的函式物件, 比如常見的數學、邏輯運算等。例如:negate<type>(),plus<type>(),minus<type>(),multiplies<type&g

objective-c 物件靜態資料成員靜態成員函式方法

作為初學者,相信大家都對objective-c的靜態資料成員和靜態成員函式都挺糾結的,我現在和大家分享下我對這個知識點的理解,請大家多多指點.... 如果大家學過C++,那麼都應該知道和了解靜態資料成

Java併發十八:阻塞佇列BlockingQueue BlockingQueue阻塞佇列)詳解 二叉堆(一)之 圖文解析 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

資料的邏輯結構儲存結構物理結構

《資料結構有哪些》一節講到,資料的儲存方式可分為線性表、樹和圖三種儲存結構,而每種儲存結構又可細分為順序儲存結構和鏈式儲存結構。資料儲存方式如此之多,針對不同型別的資料選擇合適的儲存方式是至關重要的。 那麼,到底如何選擇呢?資料儲存結構的選擇取決於兩方面,即資料的邏輯結構和儲存結構(又稱物理結構)。 邏輯

【120】TensorFlow 從CSV檔案讀取資料並訓練線性迴歸模型面向新手

正文開始。 學習 TensorFlow 讓我的思維發生了變化。 計算機本質上是一種數學的工具,而我在學習程式設計的時候,思維也不可避免地收到了影響。傳統的程式設計思想,常常認為程式就應該像數學定理或者數學函式一樣,給出一個確定的結果。這是一種基於邏輯推導

TensorFlow 的正則化Batch Normalization實現程式碼

        雖然在訓練初期使用 He 初始化方法初始ELU(或者其他派生的ReLU)能夠有效的防止梯度彌散、爆炸問題。但是這種方式無法保證梯度問題不會在訓練過程中產生。         2015年的一篇paper( “Batch Normalization: Accel

vs2010VS2012,新建專案沒有看到解決方案已解決

不知怎麼弄的,突然新建專案沒有了解決方案,想重灌太浪費時間了,網上查也沒有找到問這個問題的人,後來一想,是不是前幾天初始vs時把引數給初始了,於是,在【工具】-【選項】-【專案和解決方案】,把右邊的對勾都選上,懶得試哪

靜態代理動態代理jdk/cglib

##### **1.靜態代理模式** ![](https://img2020.cnblogs.com/blog/1054413/202008/1054413-20200811114656604-915657843.png) 代理模式上,基本上有Subject角色,RealSubject角色,Proxy

C++11Mutex互斥鎖

AR c++ 條件 oid 簡單 但是 資源 void AD 多個線程訪問同一資源時,為了保證數據的一致性,最簡單的方式就是使用 mutex(互斥鎖)。 (1).直接操作 mutex,即直接調用 mutex 的 lock / unlock 函數。此例順帶使用了 boost:

java的堆,棧,靜態程式碼區常量區

String s="java";和String s=new String("java");的區別這個問題困擾了我很久,搜到這篇文章,寫得炒雞棒!!! 一:在JAVA中,有六個不同的地方可以儲存資料: 1. 暫存器(register)。 這是最快的儲存區,因為它

Win7使用附件的遠端桌面連線Ubuntu 圖形介面xrdp方法

安裝xrdpsudo apt-get install xrdp11安裝vnc4serversudo apt-get install vnc4server11更新系統下載源sudo apt-get update11安裝xubuntu-desktopsudo apt-get

osgEarth的Rex引擎原理分析三十一osgEarth::TerrainLayer的_memCacheosgEarth::MemCache

目標:(二十一)中的問題66 繼承關係: osgEarth::Cache     osgEarth::MemCache cache中的資料是通過cachebin來實現存放的,cachebin有兩種,繼承關係為: osgEarth::CacheBin

Meta http-equiv屬性與HTTP頭的ExpiresCache-control

一、概述 A、http-equiv顧名思義,相當於http的檔案頭作用,它可以向瀏覽器傳回一些有用的資訊,以幫助正確和精確地顯示網頁內容,與之對應的屬性值為content,content中的內容其實就是各個引數的變數值。 B、Cache-control用於控制HTTP快取

Android開發屬性動畫ObjectAnimator 插值器Time Interpolator

在 Android開發中,為了保持良好的互動體驗,我們經常會用到動畫來提升使用者體驗,而動畫中屬性動畫用的最多。 雖然動畫可以讓介面看起來不是那麼粗糙,但是很多時候僅僅只是勻速運動的動畫可能不足以描述一些我們想呈現給使用者的介面,比如模擬一個下落的小球,我們知道下落的小球並不是以勻速運動的,

位元組序大小端從高低地址高低位開始理解(轉)

一、位元組序定義 位元組序,顧名思義位元組的順序,再多說兩句就是大於一個位元組型別的資料在記憶體中的存放順序(一個位元組的資料當然就無需談順序的問題了)。 其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平臺以及網路程式中位元組序才是一個應該被考慮的問題。 在所有的介紹位元組序的文章中都會提

生產者消費者之BlockingQueue阻塞佇列

注意:該隨筆內容完全引自http://wsmajunfeng.iteye.com/blog/1629354,寫的很好,非常感謝,複製過來算是個積累,怕以後找不到。 一. 前言   在新增的Concurrent包中,BlockingQueue很好的解決了多執行緒中,如何

C# + ArcEngine讀取檔案地理資料庫fileGDB資料要素生成目錄樹

首先是得到了工作空間中的要素資料集,即EnumDataSet物件,通過第一個引數傳遞進來;第二個引數是樹節點,要把遍歷得到的資料集的名字新增到該節點上,也是通過引數傳遞進來;當然,此方法前面的程式碼是要讀取工作空間,得到要素資料集EnumDataSet物件,並建立好樹節點,最

物件-6個預設函式

本文主要是對類的6個預設函式進行講解 類的預設成員函式有6個:建構函式                                                解構函式                                                

C# BitmapHalconHObject資料型別的相互轉換

              C# 中Bitmap和Halcon中HObject資料型別的相互轉換         public void Bitmap2HObjectBpp24(Bitm

C++ STL資料結構演算法

STL資料結構 STL資料結構[1] 以STL容器(Container)的形式提供,主要包括序列式容器(Sequence Containers)和關聯式容器(Associative Containers)兩大類。 序列式容器 array(build-