怎么在IOS中對(duì)ObjectiveC進(jìn)行賦值與拷貝-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在IOS中對(duì)ObjectiveC進(jìn)行賦值與拷貝,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鳳臺(tái)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

一、不同對(duì)象的賦值操作

Objective-C中有兩類對(duì)象,一類是結(jié)構(gòu)體(或者基本數(shù)據(jù)類型也算),另一類是NSObject對(duì)象。

對(duì)于結(jié)構(gòu)體,代碼直接會(huì)操作其實(shí)體,因此賦值操作會(huì)創(chuàng)建一個(gè)源對(duì)象的副本(一個(gè)新的對(duì)象);而對(duì)于NSObject對(duì)象,必須使用指針來(lái)操作對(duì)象,所以其賦值操作相當(dāng)于復(fù)制了指針,而非對(duì)象,也就是說(shuō)賦值操作使得源指針和新指針都指向同一個(gè)NSObject對(duì)象。這樣講有些難以理解,請(qǐng)看下面的代碼:

// main.m 
 
#import <Foundation/Foundation.h> 
 
@interface TestObject : NSObject 
{ 
  @public 
  int x; 
  int y; 
} 
@end 
 
@implementation TestObject 
@end 
 
typedef struct TestStruct 
{ 
  int x; 
  int y; 
} 
TestStruct; 
 
int main(int argc, const char * argv[]) 
{ 
 
  @autoreleasepool { 
     
    TestStruct ts1 = {100, 50}; 
    NSLog(@"ts1: %p, %d, %d", &ts1, ts1.x, ts1.y); 
     
    TestStruct ts2 = ts1; 
    NSLog(@"ts2: %p, %d, %d", &ts2, ts2.x, ts2.y); 
 
    TestObject* to1 = [[[TestObject alloc] init] autorelease]; 
    NSLog(@"to1: %p, %d, %d", to1, to1->x, to1->y); 
     
    TestObject* to2 = to1; 
    NSLog(@"to2: %p, %d, %d", to2, to2->x, to2->y); 
     
  } 
  return 0; 
}

程序的運(yùn)行結(jié)果如下:

ts1: 0x7fff63463898, 100, 50 
ts2: 0x7fff63463890, 100, 50 
to1: 0x7fc342d00370, 0, 0 
to2: 0x7fc342d00370, 0, 0

程序代碼首先定義了一個(gè)類TestObject(繼承自NSObject),然后又定義了一個(gè)結(jié)構(gòu)體TestStruct。這兩者都包含兩個(gè)整型的成員變量x和y。然后在main函數(shù)中,程序首先為T(mén)estStruct結(jié)構(gòu)體ts1分配內(nèi)存空間,并為其成員變量賦初值,x為100,y為50。然后通過(guò)NSLog函數(shù)打印出該結(jié)構(gòu)體的地址和成員變量的值,即輸出的第一行內(nèi)容。接著,程序執(zhí)行了賦值語(yǔ)句,將ts1賦值給另一個(gè)TestStruct結(jié)構(gòu)體對(duì)象ts2,這條語(yǔ)句會(huì)為ts2分配另一塊內(nèi)存,然后把ts1的每個(gè)成員變量的值復(fù)制過(guò)來(lái)。第二行輸出也可以看出來(lái),地址不一樣了,所以如果修改ts1的成員變量的值,是不會(huì)影響ts2的。

接著再來(lái)看TestObject。程序接著使用alloc靜態(tài)方法分配了一塊新的內(nèi)存空間,然后通過(guò)init實(shí)例方法進(jìn)行初始化(所有成員變量的值為0),最后將該內(nèi)存空間的首地址返回。to1的實(shí)質(zhì)就是一個(gè)指針,指向創(chuàng)建的TestObject對(duì)象。接著,程序?qū)o1賦值給to2。to2也是一個(gè)指向TestObject對(duì)象的指針,其值與to1一樣,即兩者都指向同一個(gè)對(duì)象。所以在這種情況下,對(duì)to1的修改會(huì)同時(shí)影響to2。

二、對(duì)象拷貝

Foundation框架的NSObject類提供了兩個(gè)方法,分別是copy和mutableCopy方法,用于對(duì)NSObject對(duì)象進(jìn)行拷貝操作。copy方法會(huì)調(diào)用NSCopying協(xié)議的copyWithZone:方法,而mutableCopy會(huì)調(diào)用 NSMutableCopying協(xié)議的mutableCopyWithZone:方法。將上面的代碼修改如下:

#import <Foundation/Foundation.h> 
 
@interface TestObject : NSObject 
{ 
  @public 
  int x; 
  int y; 
} 
@end 
 
@implementation TestObject 
- (NSString*)description 
{ 
  return [NSString stringWithFormat:@"%@: %p, x: %d, y: %d", [self class], self, x, y]; 
} 
@end 
 
typedef struct TestStruct 
{ 
  int x; 
  int y; 
} 
TestStruct; 
 
int main(int argc, const char * argv[]) 
{ 
  @autoreleasepool 
  {     
    TestObject* to1 = [[[TestObject alloc] init] autorelease]; 
    to1->x = 100; to1->y = 50; 
    TestObject* to2 = [[[TestObject alloc] init] autorelease]; 
    to2->x = 200; to2->y = 400; 
    TestObject* to3 = [[[TestObject alloc] init] autorelease]; 
    to3->x = 300; to3->y = 500; 
     
    //創(chuàng)建包含to1, to2, to3的數(shù)組array1 
    NSArray* array1 = [NSArray arrayWithObjects:to1, to2, to3, nil]; 
    NSLog(@"array1: %p, \n%@", array1, array1); 
     
    //array2是array1調(diào)用copy的結(jié)果 
    NSArray* array2 = [array1 copy]; 
    NSLog(@"array2: %p, \n%@", array2, array2); 
    [array2 release]; 
     
    //mutableArray2是array1調(diào)用mutableCopy的結(jié)果 
    NSMutableArray* mutableArray2 = [array1 mutableCopy]; 
    NSLog(@"mutableArray2: %@, %p, \n%@", [mutableArray2 class], mutableArray2, mutableArray2); 
    [mutableArray2 removeLastObject]; 
     
    NSLog(@"After remove last object of mutableArray2"); 
     
    NSLog(@"array1: %p, \n%@", array1, array1); 
    NSLog(@"array2: %p, \n%@", array2, array2); 
    NSLog(@"mutableArray2: %p, \n%@", mutableArray2, mutableArray2); 
     
    //mutableArray3是mutableArray2調(diào)用mutableCopy的結(jié)果 
    NSMutableArray* mutableArray3 = [mutableArray2 mutableCopy]; 
    NSLog(@"mutableArray3: %p, \n%@", mutableArray3, mutableArray3); 
    [mutableArray2 release]; 
     
    //array4是mutableArray3調(diào)用copy的結(jié)果 
    NSArray* array4 = [mutableArray3 copy]; 
    NSLog(@"array4: %@, %p, \n%@", [array4 class], array4, array4); 
    [mutableArray3 release]; 
    [array4 release]; 
  } 
  return 0; 
}

程序的運(yùn)行結(jié)果如下:

2012-03-22 19:20:49.548 ObjectCopy[18042:403] array1: 0x7f9071414820,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400", 
  "TestObject: 0x7f9071414230, x: 300, y: 500" 
) 
2012-03-22 19:20:49.550 ObjectCopy[18042:403] array2: 0x7f9071414820,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400", 
  "TestObject: 0x7f9071414230, x: 300, y: 500" 
) 
2012-03-22 19:20:49.551 ObjectCopy[18042:403] mutableArray2: __NSArrayM, 0x7f9072800000,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400", 
  "TestObject: 0x7f9071414230, x: 300, y: 500" 
) 
2012-03-22 19:20:49.552 ObjectCopy[18042:403] After remove last object of mutableArray2 
2012-03-22 19:20:49.552 ObjectCopy[18042:403] array1: 0x7f9071414820,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400", 
  "TestObject: 0x7f9071414230, x: 300, y: 500" 
) 
2012-03-22 19:20:49.553 ObjectCopy[18042:403] array2: 0x7f9071414820,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400", 
  "TestObject: 0x7f9071414230, x: 300, y: 500" 
) 
2012-03-22 19:20:49.553 ObjectCopy[18042:403] mutableArray2: 0x7f9072800000,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400" 
) 
2012-03-22 19:20:49.557 ObjectCopy[18042:403] mutableArray3: 0x7f90729000d0,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400" 
) 
2012-03-22 19:20:49.558 ObjectCopy[18042:403] array4: __NSArrayI, 0x7f9071416e70,  
( 
  "TestObject: 0x7f90714141b0, x: 100, y: 50", 
  "TestObject: 0x7f90714141c0, x: 200, y: 400" 
)

程序的運(yùn)行結(jié)果有幾點(diǎn)值得注意,首先是array1與array2的地址相同,因?yàn)镹SArray對(duì)象在創(chuàng)建之后是不可以修改的。其次,NSArray的mutableCopy方法會(huì)返回一個(gè)NSMutableArray對(duì)象。第三,對(duì)于NSArray或者NSMutableArray來(lái)說(shuō),mutableCopy方法會(huì)創(chuàng)建新的可變數(shù)組對(duì)象,但其每個(gè)數(shù)組成員的值僅僅是原數(shù)組的一個(gè)指針賦值,這就是淺拷貝。而與之相對(duì)的則是深拷貝,即復(fù)制數(shù)組時(shí)不是復(fù)制數(shù)組每個(gè)元素的引用,而是創(chuàng)建一個(gè)與之相同的新對(duì)象。

第四,在NSArray對(duì)象上調(diào)用mutableCopy方法返回一個(gè)NSMutableArray對(duì)象,而在NSMutableArray對(duì)象上調(diào)用copy方法則返回一個(gè)NSArray對(duì)象,而不是NSMutableArray對(duì)象。

看完上述內(nèi)容,你們對(duì)怎么在IOS中對(duì)ObjectiveC進(jìn)行賦值與拷貝有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享名稱:怎么在IOS中對(duì)ObjectiveC進(jìn)行賦值與拷貝-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.muchs.cn/article32/shcpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司、做網(wǎng)站、網(wǎng)站策劃、商城網(wǎng)站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化