問題1:求以下程序段的輸出
int test(int x, int y) { x = x + y; return x * y; } int main(int argc, const char * argv[]) { @autoreleasepool { int x = 3, y = 10, z = test(x, y); NSLog(@"%d%d", x++, ++z); } return 0; }
答案:3131
問題2:求以下程序段的輸出
int func(int x) { int countx = 0; while (x) { countx++; x = x&(x-1); } return countx; } int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"%d", func(2013)); } return 0; }
答案:9
問題3:簡述兩個for循環的優缺點
for (i = 0; i < N; i++) { if (condition) { doSomeThing(); } else { doOtherThing(); } } if (condition) { for (i = 0; i < N; i++) { doSomeThing(); } } else { for (i = 0; i < N; i++) { doOtherThing(); } }
答案:無
問題4:請指出下面代碼的問題
UIView *tmpView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.view addSubview:tmpView];
答案:無
問題5:你所了解的單例有哪些?請寫了一個單例的示例代碼。
答案:
@interface Manager : NSObject + (id)sharedManager; @end
static Manager *instance = nil; @implementation Manager + (id)sharedManager { if (!instance) { instance = [[super allocWithZone:NULL] init]; } return instance; } // 復寫allocWithZone和copyWithZone的目的是在外部多次調用alloc的時候,內部能夠確保對象只創建了一次 + (id)allocWithZone:(NSZone *)zone { return [[self sharedManager] retain]; } - (id)copyWithZone:(NSZone *)zone { return self; } // 復寫retain、retainCount、release、autorelease避免單件對象被外部釋放 - (id)retain { return self; } - (NSUInteger)retainCount { return NSUIntegerMax; } - (void)release { } - (id)autorelease { return self; }
問題6:在你的日常開發過程中,是否遇到過崩潰問題?怎么解決?
答案:無
問題7:請寫出使用委托(代理)的示例代碼。
答案:
A委托B
A.h
@protocol ADelegate; @interface A : NSObject @property (nonatomic, assign) id<ADelegate> delegate; - (void)go; @end @protocol ADelegate <NSObject> - (void)doSomeThing; @end
A.m
@implementation A - (void)go { if ([_delegate respondsToSelector:@selector(doSomeThing)]) { [_delegate doSomeThing]; } } @end
B.h
#import "A.h" @interface B : NSObject<ADelegate> @end
B.m
@implementation B - (void)doSomeThing { NSLog(@"do something..."); } @end
man.m
#import "A.h" #import "B.h" int main(int argc, const char * argv[]) { @autoreleasepool { A *a = [[A alloc] init]; B *b = [[B alloc] init]; a.delegate = b; [a go]; [a release]; [b release]; return 0; } }
// 輸出
do something...
問題8:寫出控制器加載視圖的常規調用方法流程。
答案:
loadView
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
問題9:Objective-C有多重繼承么?不是的話,請以示例代碼說明。
答案:無
問題10:請寫出下面代碼的打印結果(默認在32位機器下運行)。
char a[] = "hello world"; char *p = a;
NSLog(@"%ld", sizeof(a)); NSLog(@"%ld", sizeof(p));
答案:
12
4
如果在64位機器上運行
12
8
問題11: 請完成下面的函數
@interface NSCustomArray : NSArray @property (nonatomic, retain) NSArray *targets; - (void)updateTargetsByArray:(NSArray *)newArray; // 將newArray賦值給targets @end
@implementation NSCustomArray - (void)updateTargetsByArray:(NSArray *)newArray { NSArray *tmpArray = [[NSArray alloc] initWithArray:newArray]; // 將tmpArray賦值給targets } @end
答案:無
問題12:檢查如下代碼是否有問題,如果有問題,正確的寫法是?
- (void)setTarget:(NSObject *)target { self.target = target; }
答案:無
問題13:指出下面代碼的問題
- (void)willEndStepOne:(NSObject *)userInfo { [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self withObject:userInfo]; } - (void)doSomeThing:(NSObject *)userInfo { int max_loop_times = 999999; for (int i=0; i<max_loop_times; i++) { int randNum = rand(); NSString *tmpString = [NSString stringWithFormat:@"%d", randNum]; NSLog(@"%@", tmpString); } }
答案:無