2009-08-28 21 views
41

'da başvurulara göre değerler nasıl iletilir? Temel bir sorum var. Ben yeni bir iPhone programcısıyım. Soruma göre, kimse bana, objedeki bir işleve referans olarak değerleri nasıl iletebileceğimi söyleyebilir. C? VB ve C# 'da nasıl yapılacağını biliyorum. Ama Obj'de nasıl yapılacağını bilmiyorum c.Nesne C (iphone)

sayesinde

cevap

13

bulunmaktadır, referans ile hiçbir geçen işaretçisinin göre nesneleri geçmek amacı C. (anlamda C++) ve değer ilkel türleri için.

Örnek:

void func(NSString* string) 
{ 
    ... 
} 

void func(NSInteger myint) 
{ 
... 
} 

.. 
NSString* str = @"whatever"; 
NSInteger num = 5; 

func(str); 
func(num); 
+1

Tamamen katılıyorum! Her zaman C++ anlamında: Referansla geçmek, bir yöntemin (işlev) parametresini başka bir nesneye yönlendirmek için değiştirirseniz, dış dünyanın etkileneceğini (param, iletilen değişkenin yalnızca bir başka adıdır) ve bunun gerçekleştirilemeyeceği anlamına gelir. Nesne C'deki parametrenin kaldırılması olmadan, her zaman işaretçinin ** bir kopyası ** yöntemlere (işlevler) aktarılır. – Vassilis

+1

Objective C'de, bir nesnenin dereferleme işaretçisi çok nadirdir. Bir yöntem parametresinin değerini değiştirmek isterseniz, normal olarak aşağıdaki iki yoldan birini kullanırsınız. Frist, birçok NSError örneğinde olduğu gibi, işaretçiyi göstericilere (çift dolaylı, ** ile gösterilir) kullanır. İkincisi, bir blok olarak sarma yöntemi. Daha sonra, değişkeni blok ile aynı sözcük kapsamına koyun ve '__block' depolama türüyle belirtin. – Philip007

0

Bu demek istediğini bağlıdır. En yakın şey C (ve dolayısıyla Objective-C) bir referans tipine sahiptir. Adından da anlaşılacağı gibi, işaretçiler başka bir yerde bulunan verilere işaret eder. İşaret edilen şeyi elde etmek için işaretçiyi işaretlemeniz gerekir. Objective-C'deki nesneler asla doğrudan erişilmez - her zaman onlarla konuşmak için işaretçiler kullanırsınız. İşaretçiyi nesnelerden başka türlere de geçirebilirsiniz.

İşaretçiler zor bir konudur. Onlar için bir fikir edinmek için C'yi okumayı kesinlikle tavsiye ederim.

void nullThisObject(ref MyClass foo) 
{ 
    foo = null; 
} 

MyClass bar = new MyClass(); 
this.nullThisObject(ref bar); 
assert(bar == null); 

olan

- (void)nilThisObject:(MyClass**)foo 
{ 
    [*foo release]; 
    *foo = nil; 
} 

MyClass* bar = [[MyClass alloc] init]; 
[self nilThisObject:&bar]; 
NSAssert(bar == nil); 

ve: bu C

aşağıdaki C# kodu eşdeğer olduğu gibi

88

Geçiş referans ile amaç-C aynıdır

- (void)zeroThisNumber:(int*)num 
{ 
    *num = 0; 
} 

int myNum; 
[self zeroThisNumber:&myNum]; 
NSAssert(myNum == 0); 
+7

Lütfen yanılıyorsam beni düzeltin!Ama bence yukarıdaki "SıfırThisNumber" örneğinde, işaretçi ** değeri ** tarafından geçirilir, yani işaretçinin bir kopyası iletilir, yani "num" kelimesini başka bir int "myNum" olarak değiştirirsek değişmeyecek. Sözleşmeyle "referans olarak", orijinal objenin adresine sahip olduğumuzu doğrudan değiştirebileceğimizi söyleriz (bunu çıkartarak). – Vassilis

+0

C++ 'da olduğu gibi C nesnesinde gerçek referansla bir değerin nasıl iletileceğini gerçekten bilmiyorum. Darren tarafından açıklandığı gibi her zaman '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dır, ama yine de bir önceki yorumumda belirtildiği gibi işaretçinin bir kopyasına geçilir (iş yapılır) Elbette bu bir tür teorik meseledir. – Vassilis

+2

SıfırThisNumber örneğinde, num, başvuruyla iletilir (teknik olarak bu, C++ referansının anlamı değil). Bu örnekte, num değerinin adresi sıfırThisNumber'e geçirilir. Bu, değerin yöntemin içinde değiştirilmesine izin verir ve bu değişiklik arayan kişiye yansıtılır. Size atıfta bulunulan şey, bir referansa atıfta bulunmaktır. Num, referans ile aktarılmadıysa, num değeri kopyalanacak ve yığına yerleştirilecektir. SıfırThisNumber içinde num için yapılan herhangi bir değişiklik yığının üzerine yapılır ve yöntem döndüğünde kaybolacaktır. – Jason

13

Objecti'yi kullanırsanız

- (OSStatus) fileFileInfo: (FileInfo&)fi; 
0

: Eğer uzatma, mm ile Dosyanızı adlandırma veya, o zaman, C++ 'ile ilgisi aynı şekilde referanslarını geçebilir ++ Objective C gibi tüm kaynak, örneğin derlemek için Xcode anlatarak yapabilirsiniz C++, ettik Ortaya çıkan bir işlev çağrısından birden fazla adres almak istiyorsanız bir argüman var. Bunun yerine bir sarmalayıcı sınıfı oluşturarak ve bunu yerine geçerek yapabilirsiniz.

@interface AddressWrapper : NSObject { 
    NSArray  *array; 
    NSString *string; 
} 

@property (nonatomic, assign) NSArray *array; 
@property (nonatomic, assign) NSString *string; 
@end 

* .m olarak: Örneğin:

@implementation AddressWrapper 
@synthesize array, string; 
@end 



-(void) getAddresses: (AddressWrapper*) wrapper { 
    wrapper.array = myNSArray; 
    wrapper.string = myNSString; 
} 
7

bu şekilde deneyin:

-(void)secondFunc:(NSInteger*)i 
    { 
     *j=20; 
    //From here u can change i value as well 
    //now i and j value is same (i.e i=j=20) 
    } 
    -(void) firstFunc 
    { 
     NSInteger i=5; 
     [self secondFunc :&i]; 
    //i value is 20 
    } 

yardımcı olur Umut !!