簡體   English   中英

如何從NSMutableArray檢索和查看元素

[英]How to retrieve and view the elements from the NSMutableArray

我正在嘗試從“ Objective C for Dummies”一書中舉一些例子。 我試圖用下面的代碼來檢索元素,但是徒勞。 所有這些都被視為NSMutableArray中的對象。 但是我不知道如何使用對象來檢索元素。

主目錄

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"
int main(int argc, char *argv[]) {
        Budget* europeBudget=[Budget new];
        NSMutableArray *transactions=[[NSMutableArray alloc] initWithCapacity:10];
        [europeBudget createBudget:1000.00 withExchangeRate:1.2500];
        Transaction* aTransaction;
        aTransaction = [Transaction new];
        for(int n=1;n<2;n++){
                aTransaction = [[Transaction alloc] init];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                [aTransaction release];
        }

        int n=1;
        while (n<3) {
                aTransaction = [[Transaction alloc]init];
                [aTransaction createTransaction:n*100 ofType:credit];
                [transactions addObject:aTransaction];
                [aTransaction release];
                n++;
        }

        do{
                aTransaction = [[Transaction alloc]init];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                [aTransaction release];
                n++;
        }while (n<=3);

        NSLog(@"\nNumber of elements in an array:%i",[transactions count]);
        int c;
        c=[transactions count];
        NSLog(@"\nThe Elements are:\n");
        for(int i=0;i<c;i++){
                NSLog(@"%@",[transactions objectAtIndex:i]);
        }

        for(Transaction *aaTransaction in transactions){
         switch ([aTransaction returnType]) {
                case cash:
                        [europeBudget spendDollars:[aaTransaction returnAmount]];
                        break;
                case credit:
                        [europeBudget changeForeignCurrency:[aaTransaction returnAmount]];
                        break;
                default:
                        break;
         }
        }
        [transactions release];
        [europeBudget release];

        return 0;
}

BudObj.h

#import <Foundation/Foundation.h>

@interface 
Budget : NSObject {

        float  exchangeRate;
        double budget;
        double exchangeTransaction;

}

- (void) createBudget: (double) aBudget withExchangeRate: (float) anExchangeRate;
- (void) spendDollars: (double) dollars;
- (void) changeForeignCurrency: (double) foreignCurrency;

@end

BudObj.m

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"

@implementation Budget

- (void) createBudget: (double) aBudget withExchangeRate: (float) anExchangeRate{
        budget = aBudget;
        exchangeRate = anExchangeRate;
}


- (void) spendDollars:(double)dollars{
    budget = budget - dollars;
        NSLog(@"Converting %0.2f US Dollars into Foreign Currency leaves $%0.2f",dollars,budget);
}

- (void) changeForeignCurrency:(double)foreignCurrency{
    exchangeTransaction = foreignCurrency * exchangeRate;
        budget = budget - exchangeTransaction;
        NSLog(@"Charging %0.2f in Foreign Currency leaves $%0.2f",foreignCurrency,budget);
}

@end

Transaction.h

#import <Cocoa/Cocoa.h>

typedef enum{cash,credit} transactionType;

@interface Transaction : NSObject {

        transactionType type;
        double amount;

}

-(void)createTransaction:(double)theAmount ofType:(transactionType)theType;
-(double)returnAmount;
-(transactionType)returnType;

@end

Transaction.m

#import "Transaction.h"

@implementation Transaction

-(void)createTransaction:(double)theAmount ofType:(transactionType)theType{

        type=theType;
        amount=theAmount;

}

    -(double)returnAmount{

            return amount;

    }

    -(transactionType)returnType{

            return type;

    }

@end

輸出量

The Elements are:
2011-04-15 18:12:11.039 BudObj.m[2180:a0f] <Transaction: 0x10010c950> //Could not retreive the data from the array it's showing up some address
2011-04-15 18:12:11.039 BudObj.m[2180:a0f] <Transaction: 0x100104fe0> //
2011-04-15 18:12:11.040 BudObj.m[2180:a0f] <Transaction: 0x100106c60> //
2011-04-15 18:12:11.040 BudObj.m[2180:a0f] <Transaction: 0x100106d00> //
2011-04-15 18:12:11.041 BudObj.m[2180:a0f] Converting 100.00 US Dollars into Foreign Currency leaves $900.00
2011-04-15 18:12:11.041 BudObj.m[2180:a0f] Converting 100.00 US Dollars into Foreign Currency leaves $800.00
2011-04-15 18:12:11.041 BudObj.m[2180:a0f] Converting 200.00 US Dollars into Foreign Currency leaves $600.00
2011-04-15 18:12:11.042 BudObj.m[2180:a0f] Converting 300.00 US Dollars into Foreign Currency leaves $300.00
for (Transaction* transaction in transactions) {
   //do stuff here, or just print the object with something like the code below
   NSLog(@"Transaction:  %@", transaction);
}

當然,當您有這樣的代碼時:

[aTransaction createTransaction:n*100 ofType:credit];
[transactions addObject:aTransaction];

...您實際上並沒有在數組中存儲新創建的事務。 您只是多次存儲變量aTransaction 您可能會遇到類似以下的情況:

Transaction* nextTransaction = [aTransaction createTransaction:n*100 ofType:credit];
[transactions addObject:nextTransaction];

編輯:

您可能會有更多的運氣:

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"
int main(int argc, char *argv[]) {
        Budget* europeBudget=[[Budget alloc] init];
        NSMutableArray *transactions=[[NSMutableArray alloc] initWithCapacity:10];
        [europeBudget createBudget:1000.00 withExchangeRate:1.2500];
        Transaction* aTransaction = nil;
        for(int n=1;n<2;n++){
                //this adds 1 transaction to the array
                aTransaction = [[[Transaction alloc] init] autorelease];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
        }

        int n=1;
        while (n<3) {
                //this adds 2 transactions to the array
                aTransaction = [[[Transaction alloc] init] autorelease];
                [aTransaction createTransaction:n*100 ofType:credit];
                [transactions addObject:aTransaction];
                n++;
        }

        do{
                //this adds 1 transaction to the array
                aTransaction = [[[Transaction alloc] init] autorelease];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                n++;
        }while (n<=3);

        //there should be 4 elements in the array now
        NSLog(@"\nNumber of elements in an array:%i",[transactions count]);  
        int c;
        c=[transactions count];
        NSLog(@"\nThe Elements are:\n");
        for(int i=0;i<c;i++){
                Transaction* trans = [transactions objectAtIndex:i];
                NSLog(@"Transaction %d:  %@; type=%d, amount=%f", i, trans, [trans returnType], [trans returnAmount]);
        }

        for(Transaction *aaTransaction in transactions){
         switch ([aTransaction returnType]) {
                case cash:
                        [europeBudget spendDollars:[aaTransaction returnAmount]];
                        break;
                case credit:
                        [europeBudget changeForeignCurrency:[aaTransaction returnAmount]];
                        break;
                default:
                        break;
         }
        }
        [transactions release];
        [europeBudget release];

        return 0;
}

您在輸出中看到的地址並不意味着程序無法在數組中找到Transaction 實際上,這是完全相反的意思。 該地址是您的Transaction實例在內存中的地址。 它被打印為地址的原因是因為這是打印NSObject實例時的默認行為。 您的類不會覆蓋此默認行為,因此您在打印時會獲得內存地址。

如果要覆蓋此默認行為,可以執行以下操作:

#import "Transaction.h"

@implementation Transaction

    //override the 'description' method to change how your object prints
    -(NSString*)description {
        NSString* friendlyType = theType == cash ? @"cash" : @"credit";
        return [NSString stringWithFormat:@"Transaction:  type=%@, amount=%f", friendlyType, amount];
    }

    -(void)createTransaction:(double)theAmount ofType:(transactionType)theType{
        type=theType;
        amount=theAmount;
    }

    -(double)returnAmount{
            return amount;
    }

    -(transactionType)returnType{
            return type;
    }

@end

您遇到的問題是,您正在NSLog中將對象輸出為整數( i )。 相反,您應該使用@

另一個問題是,Objective-C中的對象是引用類型。 這意味着當您將一個對象分配給另一個對象時,請說:

Transaction* transA = [[Transaction alloc] init];
Transaction* transB = [[Transaction alloc] init];

transB = transA;

前兩行創建兩個單獨的對象。 但是第三行將transB指定為對transA引用 也就是說,它們是同一對象 另外,由於transB不再指向原始對象,因此會泄漏內存。

盡管我不確定100%如何創建對象,但是類似於[aTransaction createTransaction:n*100 ofType:cash]; 正在將值分配給同一對象( aTransaction )。 這意味着,數組中包含的所有對象很可能都是指向同一對象的指針。 而且,如果它們不返回自動釋放的對象,則可能會泄漏內存。


NSArrayNSMutableArray (或可能是任何集合類型)中記錄元素的一種簡單方法是簡單地執行以下操作:

NSArray* someArray = [NSArray array];
// Add items here.
NSLog(@"SomeArray: %@", someArray);

輸出將自動為您格式化。

您已經在代碼的最后4行中將對象從數組中移出了。

當您使用[transactions objectAtIndex:i] ,它將返回數組中的i'th transaction對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM