2012-04-04 80 views
0

這是一個noob問題,但我不能爲我的生活弄清楚爲什麼我的MSMutableArray類變量沒有被設置。下面是我的代碼:爲什麼我的Objective-C類實例變量沒有被設置?

@interface MyClass : NSObject { 
    NSMutableArray *imageArr; 
} 

@implementation MyClass 
-(id)init 
{ 
    self = [super init]; 
    if (self) { 
     imageArr = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void) checkImageArr { 
    NSLog(@"imageArr size::%@",[imageArr count]); 
} 

運行此代碼時,被設置到日誌如下:

imageArr size::(null) 

這是爲什麼變量沒有被設置?我看了下面的question,並沒有看到我的代碼和接受的答案有什麼不同。

謝謝。

回答

1

%@說明符期望參數是一個id(或指向一個對象的指針)。 -count返回一個不是對象的NSUInteger。由於數組爲空,因此計數爲零,因此參數將被解釋爲無對象,與一起使用時與%@指定符一起使用。

如果參數不爲零,則會發送-description以獲取要插入日誌消息的字符串。所以,如果你添加一個對象到你的數組中,NSLog會嘗試將1解釋爲一個對象指針,併發送-description給它。這會導致EXC_BAD_ACCESS異常(嘗試它!)。

您需要一個將參數解釋爲數字的格式說明符。 NSUinteger定義如下

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef unsigned long NSUInteger; 
#else 
typedef unsigned int NSUInteger; 
#endif 

因此它可能是一個unsigned long。爲了安全起見,我總是投它確保,所以你需要這樣的:

NSLog(@"imageArr size::%lu", (unsigned long)[imageArr count]); 
1

count方法返回一個NSUInteger。

試試這個日誌格式代替:

NSLog(@"imageArr size::%u",[imageArr count]); 
+0

這是把一個投中,因爲NSUInteger不能保證是一個無符號'int' – JeremyP 2012-04-04 14:45:01

0
NSLog(@"imageArr size::%@",[imageArr count]); 

,當你想「寫一個對象」你應該使用%@據我所知,這就像寫[對象描述。 [imageArr計數]是一個int,對不對?它不是指向對象的指針。

您應該使用%i而不是%@。並且大小將爲0.

嘗試NSLog(@「imageArr size ::%@」,imageArr);如果你想寫一個地址

+0

'NSUInteger'是'無符號的一個好主意長'在iPhone上,所以'%i'是錯的。 – JeremyP 2012-04-04 14:57:00

相關問題